回到课程

将装饰器 "defer()" 添加到函数

重要程度: 4

在所有函数的原型中添加 defer(ms) 方法,该方法返回一个包装器,将函数调用延迟 ms 毫秒。

下面是它应该如何执行的例子:

function f(a, b) {
  alert( a + b );
}

f.defer(1000)(1, 2); // 1 秒后显示 3

请注意,参数应该被传给原始函数。

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); // 1 秒后显示 3

请注意:我们在 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();