tilbage til lektionen

Tilføj "defer()" til funktioner via decorator pattern

vigtighed: 4

Tilføj til prototypen af alle funktioner metoden defer(ms), som returnerer et wrapper-objekt, der forsinker kaldet med ms millisekunder.

Her er et eksempel på hvordan det skal virke:

function f(a, b) {
  alert( a + b );
}

f.defer(1000)(1, 2); // viser 3 efter 1 sekund

Bemærk at argumenterne skal videreføres til den originale funktion.

Function.prototype.defer = function(ms) {
  let f = this;
  return function(...args) {
    setTimeout(() => f.apply(this, args), ms);
  }
};

// tjek det
function f(a, b) {
  alert( a + b );
}

f.defer(1000)(1, 2); // viser 3 efter 1 sekund

Bemærk: vi bruger this i f.apply for at få dekoration til at virke korrekt for objektmetoder.

Så hvis wrapper-funktionen kaldes som en objektmetode, så sendes this til den originale metode f.

Function.prototype.defer = function(ms) {
  let f = this;
  return function(...args) {
    setTimeout(() => f.apply(this, args), ms);
  }
};

let user = {
  name: "Ahmed",
  sayHi() {
    alert(this.name);
  }
}

user.sayHi = user.sayHi.defer(1000);

user.sayHi();