関数のデコレーティング「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();