모든 객체에는 __proto__ 라는 속성이 있다.
이 속성은 어떤 객체를 가리킨다. 그것은 모든 객체의 조상인 Object 이다.
자바스크립트는 객체에 있는 메소드에 찾는 메소드가 있는지 찾은 뒤 없다면
__proto__가 가리키고 있는 객체에 접근해 그 메소드가 있는지 확인한다.const a1 = { name: 'Hulk', power: 120 } const a2 = { name: 'Tony', money: 'infinite' } const a3 = { name: 'Thor', girlfriend: 'Mjolnir' } a1.__proto__ = a2; console.log(a1.money) // 'infinite' //a1에는 money라는 속성이 없다. a1의 __proto__가 가리키고 있는 객체에서 속성을 찾는다. 있다. 출력된다. a2.__proto__ = a3; console.log(a1.girlfriend) // 'Mjolnir' // a1에 없다 a1.__proto__와 연결된 a2에서 찾는다. 없다. a2.__proto__와 연결된 a3에서 찾는다. 있다.
*객체는 자신이 필요한 메소드만 가지고 있고, 공통적으로 사용될 만한 것들은 상위 객체에서 프로토타입으로 연결시켜 재활용할 수 있는 프로토타입 메카니즘.
function printName(name) { this.name = name; }// prototype이라는것을 가진다. 객체이며 그 함수 자체를 가리킨다. const n = new printName('chris'); console.log(n.name) // 'chris' printName.prototpye.weapon = 'shield' console.log(n) // name: 'chris' console.log(n.weapon) // 'shield'
printName도 일반 객체이기 때문에 .__proto__를 가지고 있고,
new 연산자가 내부적으로 this.__proto__ = printName.prototype; 이렇게 연결시켜 준다.
*n에는 weapon이라는 속성이 없다. 연산자로 만들어진 부모의 __proto__ 값을 조회한다.
부모의 __proto__은 new 연산자가 prototype과 연결해 주었다.
printName.prototype.weapon으로 속성 값을 추가 했기 때문에 그 값을 자식이 찾을 수 있다.