在函数中添加装饰器 "defer()"
重要性:4
在所有函数的原型中添加方法 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();