關於SO的第一個問題,我希望我不會重複任何內容;我已經看過otherquestions,並認爲我不同意足以保證提問。有沒有一種方法在使用ES6速記方法符號的方法中使用`this`這個詞彙?
基本上,有沒有辦法讓this
在使用簡寫符號寫成的方法的方法體中是詞法還是綁定到特定值?
這樣做的動機來自我想在實施iterator protocol時使用ES6方法的速記,其中@@iterator
方法在調用時返回一個迭代器對象。該迭代器對象必須有一個next()
方法,該方法在調用時會返回另一個對象。在第二個對象中,我想引用原始的(在我的例子中爲Graph
)實例。
注意,在下面的代碼片段,它不不工作按計劃到期this
結合,next()
使用ES6 method definition shorthand來。
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
上下文中d是指速記方法體中的那個。我認爲這是我能得到的最接近的?
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 };
}
};
}
}
'下:()=>'並不比'下長得多()'。我只想跟那個一起去。 – Ryan
箭頭語法的要點在於,它繼承了詞彙'this',而不是從它被稱爲的'this'。人們似乎只想現在只使用箭頭語法,並以某種方式使其完成原始語法所做的一切。這不僅僅是它的設計。如果你不打算使用詞法'this',那麼你可能不應該使用箭頭語法。使用更長的語法,然後你可以'.bind()'到你的心中。 – jfriend00
@ jfriend00:他們要求相反的,我認爲:詞彙'this',但仍然用簡寫法表示。 – Ryan