torna alle lezioni

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