6-2-1 메소드 오버라이드

Untitled

자바스크립트 엔진은 메소드를 찾을 때 가장 가까운 대상인 자신의 프로퍼티를 먼저 검색하고, 그 다음 가까운 대상인 __proto__를 검색한다. 즉 __proto__에 있는 메소드는 자신에게 있는 메소드보다 우선 순위에서 밀려 호출되지 않은 것이다.

메소드 오버라이딩이 된 상태에서 prototype에 있는 메소드에 어떻게 접근할까?

console.log(iu.__proto__.getName());    //undefined

→iu.proto.getName을 출력했더니 undefined가 나온다. this가 prototype 객체(iu.proto)를 가리키는데 prototype에는 name이라는 프로퍼티가 없기 때문이다.

Person.prototype.name = '이지금';
console.log(iu.__proto__.getName());    //이지금

→prototype에 name이라는 프로퍼티를 부여했더니 값이 잘 출력됨을 볼 수 있다.

but

여기서 this가 instance가 아닌 prototype을 바라보는데 아래와 같이 call 혹은 apply로 이 문제를 해결할 수 있다.

console.log(iu.__proto__.getName.call(iu));

즉 메서드가 오버라이드된 경우 자신으로부터 가장 가까운 메서드에만 접근할 수 있지만 __proto__의 메서드에도 우회적인 방법으로나마 접근 가능하다.

6-2-2 프로토타입 체인

프로토타입 체인?

배열 리터럴의 내부 구조를 봤을 때 이 __proto__의 안에는 __proto__가 또 존재함