レッスンに戻る

関数のデコレーティング「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.applythisを使用しています。

したがって、ラッパー関数がオブジェクトのメソッドとして呼び出される場合、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();