* 이 글은 코어자바스크립트 책을 참고하여 기록하였습니다.
prototype 객체를 참조하는 __proto__를 생략하면
인스턴스는 prototype에 정의된
- property
- method
마치 자신의 것처럼 사용 가능.
예제 6-6.
01 var Person - function (name) {
02 this.name = name;
03 }
04 Person.prototype.getName = function () {
05 return this.name;
06 }
07
08 var iu = new Person('지금');
09 iu.getName - function() {
10 return '바로' + this.name;
11 };
12 console.log(iu.getName()); // 바로 지금
Person
생성자에도 getName
이 있지만
iu
에 할당된 getName
메서드가 호출 되었다
자바스크립트 엔진이 getName
메서드를 찾는 방식
- 가장 가까운 대상인
자신의 프로퍼티
검색 - 없으면 그 다음의 가까운 대상인
__proto__
를 검색
🚨 __proto__의 getName 메서드를
iu의 getName 메서드로 교체해서 없애는 것이 아닌
원본 즉 __proto__의 getName 메서드는 그대로 유지되고 있는 상태에서
그 위에 iu의 getName 메서드가 얹혀진 상태라 볼 수 있다.
여기서 일어나는 현상을 메서드 오버라이드
라고 한다.
메서드 오버라이딩 상태에서 prototype의 메서드 접근 시
console.log(iu.__proto__.getName()); // undefined
this가 prototype을 가리키는데
prototype에는 name 프로퍼티가 없기 때문에
undefined
가 출력됐다
Person.prototype.name = '이지금';
console.log(iu.__proto__.getName()); // 이지금
prototype
에 name
프로퍼티에 값을 할당하니
iu.__proto__.getName()
를 호출했을 때 '이지금'
이 출력됐다
prototype을 바라보는 this를 인스턴스로 바꿔주기
console.log(iu.__proto__.getName.call(iu)); // 지금
call
또는 apply
를 써서 this
가 iu
를 바라보게끔 수정
일반적으로 메서드가 오버라이드된 경우
먼저 자신으로부터 가장 가까운 메서드에 접근하지만
__proto__
의 메서드도 우회적인 방법을 통해 접근이 불가능한 것은 아니다.