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 };
}
};
}
}