zpět k lekci

Přidejte do funkcí dekorační „odlož()“

důležitost: 4

Přidejte do prototypu všech funkcí metodu odlož(ms), která vrátí obal, který odloží volání funkce o ms milisekund.

Zde je příklad, jak by to mělo fungovat:

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

f.odlož(1000)(1, 2); // zobrazí 3 za 1 sekundu

Prosíme všimněte si, že argumenty by měly být předány původní funkci.

Function.prototype.odlož = function(ms) {
  let f = this;
  return function(...argumenty) {
    setTimeout(() => f.apply(this, argumenty), ms);
  }
};

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

f.odlož(1000)(1, 2); // zobrazí 3 za 1 sekundu

Prosíme všimněte si: ve f.apply používáme this, aby naše dekorace fungovala pro objektové metody.

Jestliže je tedy obalová funkce volána jako objektová metoda, pak se this předá původní metodě f.

Function.prototype.odlož = function(ms) {
  let f = this;
  return function(...argumenty) {
    setTimeout(() => f.apply(this, argumenty), ms);
  }
};

let uživatel = {
  jméno: "Jan",
  řekniAhoj() {
    alert(this.jméno);
  }
}

uživatel.řekniAhoj = uživatel.řekniAhoj.odlož(1000);

uživatel.řekniAhoj();