더북(TheBook)

다음 줄 끝에서 멍키 패칭이 일어난다.

koko.useSignLanguage = trainer.useSignLanguage;

 

조련사(trainer)의 수화(sign language) 능력을 코코(Koko)에게 패치한다. 코코에게 (Human.useSignLanguage 함수의 this에 있어야 할, 즉 useSignLanguage 앞에 점(.)을 붙여 연결할 객체의 한 부분인) 손(hands)이 있기에 가능한 일이다. useSignLanguageHuman에서 비롯되었지만, 이 함수 앞에 점을 붙여 호출하면(koko.useSignLanguage) 사람이 아닌 코코의 손을 움직인다. 단계별로 더 자세히 살펴보자.

1. koko.useSignLanguage('Hello!')를 호출한다.

2. 멍키 패칭을 했으니 MyApp.Human.prototype.useSignLanguage가 실행된다.

3. 이 함수는 this.hands에 접근한다.

4. 여기서 thisuseSignLanguage를 호출한 객체, 즉 MyApp.Gorilla 객체(koko)다. 따라서 MyApp.Gorilla 객체도 비로소 수화할 수 있는 손을 가지게 되었다!

빌린 함수에 (나중에라도!) 다른 요건이 추가될 가능성은 항상 있다. 따라서 패치를 관장하는 빌려주는 객체가 빌리는 객체가 요건을 충족하는지 알아보게 하는 것이 가장 좋은 멍키 패칭 방법이다.


MyApp.Human.prototype.endowSigning = function(receivingObject) {
if (typeof receivingObject.getHandCount === ‘function’
&& receivingObject.getHandCount() >= 2) {
  receivingObject.useSignLanguage = this.useSignLanguage;
} else {
  throw new Error(“미안하지만 너에게 수화를 가르쳐줄 수는 없겠어.”);
}
};

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.