Vorremo rendere disponibile questo progetto open-source per persone in tutto il mondo.

Aiutaci a tradurre il contenuto di questo tutorial nella tua lingua!

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();
Morty Proxy This is a proxified and sanitized view of the page, visit original site.