我和我的同事曾多次討論過這個問題。有兩種方法來定義類方法。第一種方式是通過函數聲明:類方法的函數聲明或表達式?
class Action {
public execute(): void {
this.doSomething();
}
...
}
函數聲明往往更容易閱讀。 Action
的每個實例只使用一個函數對象,因此它們也更友善。
第二個是與函數表達:
class Action {
public execute:() => void =() => {
this.doSomething();
};
...
}
函數表達式需要更多的分型(尤其是類型定義),更難讀,並生成用於Action
每實例的新功能的對象。如果你生成很多很多的對象,那很糟糕。
然而,函數表達式有一個小的好處:他們保留的this
上下文(即Action
實例)不管是誰稱他們爲:
var instance = new Action();
setTimeout(instance.execute);
聲明爲函數表達式將按預期在這方面的一個方法案件。函數聲明慘遭失敗,但他們可以很容易地通過這樣做,而不是固定:
var instance = new Action();
setTimeout(() => instance.execute());
// or
setTimeout(instance.execute.bind(instance));
因此,被認爲是一個比其他更好的方法,或者是這種純粹的情景/優惠?
非常好。我甚至沒有考慮過繼承/原型場景。即使一個方法可能被用作事件處理程序,我也會認爲大多數情況可以使用上面描述的匿名函數包裝來緩解。 – Craxal
@Craxal我更喜歡使用'bind'函數而不是匿名函數,但是在任何情況下它都不是很忙碌。 –
喜歡「綁定」有什麼好處嗎?我想你不必擔心明確處理和傳遞參數。 – Craxal