关于SO的第一个问题,我希望我没有重复任何内容;我看过other 问题并认为我的不同足以值得询问。
基本上,有没有办法让this
它位于使用速记符号编写的方法的方法主体中,或者是词法的,或者是绑定到特定值的?
这样做的动机来自于我在实现时想要使用 ES6 方法简写迭代器协议,其中@@iterator
方法在调用时返回一个迭代器对象。该迭代器对象必须有一个next()
方法,当调用它本身时返回另一个对象。在第二个对象中,我想要引用原始对象(在我的例子中,Graph
) 实例。
请注意,在下面的代码片段中,它确实not按预期工作,因为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
};
}
}
冰泡菜在评论中提出了一个很好的观点,我可以使用 storethis
context 并在速记方法主体中引用它。我假设这是我能得到的最接近的结果?
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 };
}
};
}
}