当前位置: 首页 > 知识库问答 >
问题:

有没有办法在使用ES6速记方法符号的方法中使用词汇“this”?

微生乐
2023-03-14

关于SO的第一个问题,我希望我没有重复任何东西;我已经看了其他问题,认为我的问题足够不同,值得问。

基本上,有没有一种方法可以将使用速记符号编写的方法体中的this设置为词法形式或绑定到特定值?

之所以这样做,是因为我在实现迭代器协议时希望使用ES6方法速记,在该协议中,@@iterator方法在调用时返回迭代器对象。迭代器对象必须有一个next()方法,当调用该方法时,该方法本身返回另一个对象。在第二个对象中,我希望引用原始(在我的例子中是,Graphhtml" target="_blank">实例。

请注意,在下面的代码片段中,由于this绑定而无法正常工作,Next()使用的是ES6方法定义的速记。

class Graph {
  constructor(initialNodes) {
    this.data = [...initialNodes];
  }

  [Symbol.iterator]() {
    let nextIndex = 0;
    // `this` binding is fine here, as expected
    return {
      // look at that beautiful shorthand
      next() {
        return nextIndex < this.data.length
          // `this` binding is not fine here
          ? { done: false, value: this.data[nextIndex++] }
          : { done: true };
      }
    };
  }
}

我知道在对象返回上面定义函数,然后将该函数分配为返回对象的属性,但我再次想知道方法速记语法是否可行。

将返回对象上方的next()定义为常规函数,然后将其绑定到对象属性赋值中:

class Graph {
  // constructor

  [Symbol.iterator]() {
    let nextIndex = 0;
    // I know you can do this
    const next = function() {
      return nextIndex < this.data.length
        ? { done: false, value: this.data[nextIndex++] }
        : { done: true };
    };
    return {
      next: next.bind(this)
    };
  }
}

将返回对象上方的Next()定义为箭头函数意味着不需要bind,但仍然没有方法语法速记:

class Graph {
  // constructor

  [Symbol.iterator]() {
    let nextIndex = 0;
    // I know you can also do this
    const next = () => {
      return nextIndex < this.data.length
        ? { done: false, value: this.data[nextIndex++] }
        : { done: true };
    };
    return {
      next
    };
  }
}

Icepickle在注释中提出了一个很好的观点,我可以使用存储this上下文,并在速记方法主体中引用它。我想这是我能找到的最近的了?

class Graph {
  // constructor

  [Symbol.iterator]() {
    let nextIndex = 0;
    const self = this;
    return {
      next() {
        return nextIndex < self.data.length
          ? { done: false, value: self.data[nextIndex++] }
          : { done: true };
      }
    };
  }
}

共有1个答案

燕正德
2023-03-14

解决问题的理想方法是使用合适的工具:发电机功能。它们也可以与速记语法一起使用,它们将正确地绑定

生成器函数返回符合迭代器协议的对象,并可以使用yield*将迭代器的输出委托给另一个iterable对象(如数组)。

class Graph {
  constructor(initialNodes) {
    this.data = [...initialNodes];
  }

  * [Symbol.iterator]() {
    yield* this.data;
  }
}

const graph = new Graph([1, 2, 3]);
for (const node of graph) {
  console.log(node);
}
 类似资料:
  • 问题内容: 我想在Python中使用PhantomJS。我用谷歌搜索了这个问题,但是找不到合适的解决方案。 我发现 可能是一个不错的选择。但是我无法通过一些争论。 使用可能是目前合适的解决方案。我想知道是否有更好的解决方案。 有没有办法在Python中使用PhantomJS? 问题答案: 在python中使用PhantomJS的最简单方法是通过Selenium。最简单的安装方法是 安装NodeJS

  • 我想在Python中使用PhantomJS。我谷歌了这个问题,但找不到合适的解决方案。 我发现可能是一个不错的选择。但我无法向它传递一些论据。 使用目前可能是一个合适的解决方案。我想知道是否有更好的解决办法。 有没有办法在Python中使用PhantomJS?

  • 因为这个方法是在运行时执行的,所以需要对它进行测试吗

  • 这是我的模拟测试: 现在我的问题是,是否有一种方法可以断言我希望在控制器中调用的方法实际上已经被调用。 我知道,但是我怎么用单元测试来断言呢? 例如,这是我在控制器中的请求映射: 现在我想作一些断言,例如: 所以,基本上我想断言,我希望被调用的方法就是被调用的那个方法。我知道这可以在我拥有的MockService对象上完成,即inputValidationService,但我也想为控制器提供类似的

  • 问题内容: 我是ElasticSearch的新手,对停用词有疑问。我有一个索引,其中包含美国的州名。例如:纽约/纽约州,加利福尼亚/加拿大,俄勒冈州/俄勒冈州。我相信俄勒冈州的缩写“ OR”是一个停用词,因此当我将状态数据插入索引时,无法搜索“ OR”。有什么办法可以为此设置自定义停用词,还是我做错了什么? 这是我建立索引的方式: 搜索“ NY”,效果很好。例如: 但是搜索“ OR”会返回零命中:

  • 问题内容: 有没有办法用TypeScript语言进行方法重载? 我想实现以下目标: 这是我不想做的一个例子(我真的很讨厌JS中重载hack的那一部分): 问题答案: 根据规范,TypeScript确实支持方法重载,但是它很笨拙,并且包含许多手动检查参数类型的工作。我认为这主要是因为在纯JavaScript中最接近方法重载的地方还包括检查,并且TypeScript尝试不修改实际的方法主体,以避免任何