我和我的同事曾多次讨论过这个问题。有两种方法来定义类方法。第一种方式是通过函数声明:类方法的函数声明或表达式?
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