関数のデコレーティング「defer()」を追加
重要度: 4
全ての関数のprotototypeにメソッドdefer(ms)を追加します。これはmsミリ秒呼び出しを遅らせるラッパーを返します。
これは動作する仕組みの例です。
function f(a, b) {
alert( a + b );
}
f.defer(1000)(1, 2); // shows 3 after 1 second
引数は元の関数に渡される必要があることに注意してください。
Function.prototype.defer = function(ms) {
let f = this;
return function(...args) {
setTimeout(() => f.apply(this, args), ms);
}
};
// check it
function f(a, b) {
alert( a + b );
}
f.defer(1000)(1, 2); // shows 3 after 1 sec
注意: オブジェクトのメソッドで装飾が機能するように、f.applyでthisを使用しています。
したがって、ラッパー関数がオブジェクトのメソッドとして呼び出される場合、thisは元のメソッドfに渡されます。
Function.prototype.defer = function(ms) {
let f = this;
return function(...args) {
setTimeout(() => f.apply(this, args), ms);
}
};
let user = {
name: "John",
sayHi() {
alert(this.name);
}
}
user.sayHi = user.sayHi.defer(1000);
user.sayHi();