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

Javascript 有没有办法在使用ES6速记方法符号的方法中使用词汇“this”?,javascript,methods,ecmascript-6,this,bind,Javascript,Methods,Ecmascript 6,This,Bind,第一个问题是这样的,我希望我没有重复任何东西;我看过了,觉得我的不一样,值得问一下 基本上,有没有一种方法可以将使用速记符号编写的方法体中的this设置为词法形式或绑定到特定值 之所以这样做,是因为我在实现时希望使用ES6方法速记,其中@@iterator方法在调用时返回一个迭代器对象。迭代器对象必须有一个next()方法,当调用该方法时,该方法本身返回另一个对象。在第二个对象中,我希望引用原始(在我的例子中是,Graph)实例 请注意,在下面的代码段中,this绑定导致无法正常工作,next(

第一个问题是这样的,我希望我没有重复任何东西;我看过了,觉得我的不一样,值得问一下

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

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

请注意,在下面的代码段中,
this
绑定导致无法正常工作,
next()
正在使用

将返回对象上方的
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
    };
  }
}

解决你的问题的理想方法是使用合适的工具:a。它们也可以与一起使用,并且它们将正确地绑定此

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

类图{
构造函数(初始节点){
this.data=[…initialNodes];
}
*[符号.迭代器](){
产生*这个数据;
}
}
常量图=新图([1,2,3]);
for(图的常量节点){
console.log(节点);

}
next:()=>
next()
长不了多少。我同意。箭头语法的全部要点是它继承了词法
this
,而不是
this
的调用方式。人们现在似乎只想使用箭头语法,并以某种方式让它完成原始语法所做的一切。它不是这样设计的。如果您不打算使用词法
this
,那么您可能不应该使用箭头语法。使用较长的语法,然后你就可以将
.bind()
绑定到你心中的内容。@jfriend00:他们的要求正好相反,我认为:词法
这个
,但仍然使用速记法。@Ryan-非常令人困惑的问题-看看标题就知道了。箭头语法通常不应用于方法定义,因为您希望
来自于它的调用方式
obj.method()
。我想如果不是问题的标题所说的,我就不会理解他们的要求。我放弃了。对不起,我的问题让人困惑,@jfriend00,我不想这样@Ryan说得对,因为我想保持方法的速记,但有词法
这个
。我将尝试编辑我的问题以反映这一点。如果您不完全理解我来自何处,那么上面我的代码所讨论的方法是迭代器对象:当调用
iterator.next()
时,我希望
this
next()
中引用
实例。也许这是次标准代码,不过我几乎是抄袭过来的。哇,谢谢!我没有考虑发电机,因为我没有完全摸索它们,但我想它们不太难理解。这很酷,尤其是在速记方面。我注意到在MDN速记生成器方法链接中,
*
和生成器名称之间有一个空格,而在您的代码片段中没有。我查阅了airbnb的风格指南,了解他们对此的想法,发现他们实际上甚至不建议使用迭代器或生成器。有什么想法吗@他们不喜欢迭代器的原因很小,因为他们鼓励使用非函数语法。如果您创建了一些小的辅助函数,则可以以函数的方式使用生成器。我个人觉得生成器语法非常强大,转换为数组就像
[…graph]
一样简单。我不知道速记符号有一个标准的样式,谢谢!谢谢你的回答,@4castle:)
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)
    };
  }
}
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
    };
  }
}
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 };
      }
    };
  }
}