назад до уроку

Додайте декоруючий метод "defer()" до функцій

важливість: 4

Додати до прототипу всіх функцій метод defer(ms), що повертає обгортку, що затримує виклик на ms мілісекунд.

Ось приклад того, як метод повинен працювати:

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

f.defer(1000)(1, 2); // показує 3 після 1 секунди

Будь ласка, зверніть увагу, що аргументи повинні бути передані до вихідної функції.

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

// перевіримо це
function f(a, b) {
  alert( a + b );
}

f.defer(1000)(1, 2); // показує 3 після 1 сек

Будь ласка, зверніть увагу: ми використовуємо this в f.apply, щоб наше декорування працювало для методів об’єкта.

Отже, якщо функція-обгортка викликається як метод об’єкта, то this передається до оригінального методу f.

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

let user = {
  name: "Іван",
  sayHi() {
    alert(this.name);
  }
}

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

user.sayHi();