돌아가기

데코레이팅 "defer()"를 함수에 추가하기

중요도: 4

모든 함수의 프로토타입에 ms 밀리세컨초 지연 호출 래퍼를 반환하는 defer(ms) 메서드를 추가하세요.

아래는 동작예시 입니다.

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

f.defer(1000)(1, 2); // 1초 후 3을 출력

인수들은 기존 함수에 전달되는 것을 알아두세요.

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); // 1초 후 3 출력

객체 메서드에 대한 데코레이션 동작을 만들기 위해서 thisf.apply안에서 사용하는 것을 알아두세요.

그래서 래퍼 함수가 객체 메서드로써 호출된다면 this는 기존 메서드 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();