객체 생성 방식과 프로토타입의 결정
- 객체 생성방법은 다양함
- 객체 리터럴
- Object 생성자 함수
- 생성자 함수
- Object.create 메서드
- 클래스(ES6)
- 각 객체 생성방식은 추상 연산 OrdinaryObjectCreate에 의해 생성된다는 공통점이 있음
- 프로토타입은 추상 연산 OrdinaryObjectCreate에 전달되는 인수에 의해 결정되며 이 인수는 객체가 생성되는 시점에 객체 생성방식에 의해 결정됨
객체 리터럴에 의해 생성된 객체의 프로토 타입
- 객체 리터럴에 의해 생성되는 객체의 프로토타입은 Object.prototype임
Object 생성자 함수에 의해 생성된 객체의 프로토타입
- Object 생성자 함수에 의해 생성되는 객체의 프로토타입은 Object.prototype임
- 객체 리터럴에 의해 생성된 객체와 동일한 구조를 가짐
- 객체 리터럴과 Object 생성자 함수에 의한 객체 생성 방식의 차이는 프로퍼티를 추가하는 방식임
- 객체리터럴: 객체 내부에 프로퍼티 추가
- Object 생성자 함수: 일단 빈 객체를 생성한 이후 프로퍼티를 추가해야함
생성자 함수에 의해 생성된 객체의 프로토타입
- 생성자 함수에 의해 생성되는 객체의 프로토타입은 생성자 함수의 prototype프로퍼티에 바인딩되어 있는 객체임
프로토타입 체인
function person(name) {
this.name = name;
}
Person.prototype.sayHello = function () {
console.log(`Hi! My name is ${this.name}`);
};
const me = new Person('Lee');
console.log(me.hasOwnpProperty('name'));
- Person 생성자 함수에 의해 생성된 me 객체는 Object.prototype의 메서드인 hasOwnProperty를 호출할 수 있음
- 이는 me 객체가 Person.prototype뿐만 아니라 Object.prototype도 상속받았다는 것을 의미함
- me 객체의 프로토타입은 Person.prototype임
object.getPrototypeOf(me) === Person.prototype;
- Person.prototype의 프로토타입은 object.prototype임
- 프로토타입의 프로토타입은 언제나 Object.prototype임
Object.getPrototypeOf(Person.prototype) === object.prototype;
자바스크립트는 객체의 프로퍼티(메소드 포함)에 접근하려고 할 때 해당 객체에 접근하려는 프로퍼티가 없다면 [[Prototype]]
내부 슬롯의 참조를 따라 자신의 부모 역할을 하는 프로토타입의 프로퍼티를 순차적으로 검색한다. 이를 프로토타입 체인이라 한다.
참고 자료
- 이웅모,『모던 자바스크립트 Deep Dive』, 위키북스(2021), p280-312.