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();