私の同僚と私はこの議論を何度かしてきました。クラスメソッドを定義するには2つの方法があります。最初の方法は、関数宣言である:クラスメソッドの関数宣言または式ですか?
class Action {
public execute(): void {
this.doSomething();
}
...
}
関数宣言が読みやすくなる傾向があります。 Action
のインスタンスごとに1つの関数オブジェクトのみが使用されるため、メモリにもやさしくなります。
秒表現機能である:
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'関数を使うのが好きですが、いずれの場合もそうではありません。 –
'bind 'を好むことにはどんな利点がありますか?明示的に引数を処理して渡すことについて心配する必要はありません。 – Craxal