Aggiungi il decorator "defer()" alle funzioni
importanza: 4
Aggiungi al prototype di tutte le funzioni il metodo defer(ms), il quale ritorna un wrapper (contenitore), che si occupa di invocare la funzione dopo ms millisecondi.
Qui vediamo un esempio di come dovrebbe funzionare:
function f(a, b) {
alert( a + b );
}
f.defer(1000)(1, 2); // mostra 3 dopo 1 secondo
Da notare che gli argomenti devono essere passati alla funzione originale.
Function.prototype.defer = function(ms) {
let f = this;
return function(...args) {
setTimeout(() => f.apply(this, args), ms);
}
};
// controlla
function f(a, b) {
alert( a + b );
}
f.defer(1000)(1, 2); // mostra 3 dopo 1 secondo
Da notare: utilizziamo this in f.apply per far sì che il nostro decorator funzioni con i metodi degli oggetti.
Quindi se la nostra funzione viene invocata come metodo di un oggeto, allora this viene passato al metodo originale 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();