3.9.3) 프로토타입 체인
JavaScript에서 속성이나 메서드를 참조하게 되면, 먼저 자신 안에 멤버가 정의되어있는지 찾아본 다음, 발견하지 못하면 그 프로토타입으로 이동하여 해당 프로토타입 객체 내에서 멤버를 찾는다. 이는 멤버를 찾거나, 멤버를 찾지 못하고 null을 반환하고서야 비로소 끝나는데, 이러한 객체들의 연쇄를 가리켜 프로토타입 체인(prototype chain)이라고 한다.
프로토타입 객체는 생성한 각각의 객체에서부터 최상위 객체인 Object의 프로토타입까지 연결되어있다. 다음의 예제를 살펴보자.
prototype_chain.htm |
function Person(name, age, greeting) { this.myName = name; this.myAge = age;
// 사람마다 인사하는 방법이 다르다고 하자. this.greeting = greeting; } // 사람을 표현하는 방법은 모두 같다. Person.prototype.myInfo = function() { return 'Person: ' + this.myName + ', ' + this.myAge; };
function main() { var person = new Person("kid", 10, function() { Log("I'm a boy!"); });
// 1.1) person 객체의 greeting 멤버를 찾습니다. // 1.2) greeting 멤버가 있으므로 이를 호출합니다. person.greeting();
// 2.1) person 객체에서 myInfo 멤버를 찾습니다. // 2.2) person.prototype 객체로 이동하여 myInfo 멤버를 찾습니다. // 2.3) myInfo 멤버가 있으므로 이를 호출합니다. Log(person.myInfo());
// 3.1) person 객체에서 toString 멤버를 찾습니다. // 3.2) person.prototype 객체로 이동하여 toString 멤버를 찾습니다. // 3.3) Object.prototype 객체로 이동하여 toString 멤버를 찾습니다. // 3.4) toString 멤버가 있으므로 이를 호출합니다. Log(person.toString());
// 3.1) person 객체에서 wrong 멤버를 찾습니다. // 3.2) person.prototype 객체로 이동하여 wrong 멤버를 찾습니다. // 3.3) Object.prototype 객체로 이동하여 wrong 멤버를 찾습니다. // 3.4) wrong 멤버가 없으므로 undefined를 반환합니다. Log(person.wrong); } |
실행 결과 |
I'm a boy! Person: kid, 10 [object Object] undefined |
실행 결과를 참고하여 주석을 읽어보면 프로토타입 체인을 이해할 수 있을 것이다.