将装饰器 "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();