[JS] 프로토타입 - 2

sehannnnnnn·2022년 8월 13일
0
post-thumbnail

함수 객체의 prototype 프로퍼티

함수 객체만이 소유하는 prototype프로퍼티는 생성자 함수가 생성할 인스턴스의 프로토타입을 가리킨다.

따라서 생성자 함수로써 호출 할 수 없는 함수, 즉 non-constructor 인 화살표 함수와 ES6 메서드 축약 표현으로 정의한 메서든 prototype 프로퍼티를 소유하지 않으며 프로토타입도 생성하지 않는다.

prototype 프로퍼티와 __proto__은 모두 Object.prototype으로 부터 상속받은 동일한 프로토타입을 가르킨다. 하지만, __proto__은 모든 객체가 가지고 있는 접근자 프로퍼티이고 prototype은 함수 객체 만이 갖고있다는 차이가 있다. 또한, 결정적으로 이들 프로퍼티를 사용하는 주체가 다르다는 차이점이 있는데,

prototype 프로퍼티는 함수의 생성자 함수가 사용할 수 있고, __proto_ _는 생성자 함수를 통해 생성된 인스턴스가 사용하는 프로퍼티이다.

//생성자 함수
function Person(name) {
	this.name = name;
}

const me = new Person('Lee');

console.log(Person.prototype == me.__proto__); //true

프로토타입의 constructor 프로퍼티 & 생성자 함수

모든 프로토타입은 constructor 프로퍼티를 가진다. 이 constructor 프로퍼티는 prototype 프로퍼티로 자신을 참조하고 있는 생성자 함수를 가리킨다. 즉, 함수 객체가 생성될 때 이뤄진다.

function Person(name) {
	this.name = name;
}

const me = new Person('Lee');

//me의 생성자 함수는 Person이다.
console.log(me.constructor === Person); //true

me 객체에는 constructor가 없고 me 객체의 프로토타입인 Person.prototype에서 상속받아 사용하는 것이다.


리터럴 표기법에 의해 생성된 객체의 생성자함수와 프로토타입

생성자 함수로 생성된 인스턴스는 프로토타입의 constructor 프로퍼티에 의해 생성자 함수와 연결된다.

반면, 리터럴표기법으로 생성된 객체에 경우 명시적으로 생성자 함수의 호출 없이 인스턴스를 생성한다.

이 경우에도 프로토타입이 존재하는데, constructor 프로퍼티가 가르킬 생성자 함수가 없는 것 처럼 보인다.

const obj = {};

console.log(obj.constructor === Object); // true

리터럴표기법으로 객체를 생성한 경우에는 추상연산 OrdinaryObjectCreate를 호출하여 빈 객체를 생성하고 프로퍼티를 추가하도록 정의한다.

결국, Object 생성자 함수가 생성한 객체를 프로토타입으로 결정하는 것이 아닌 추상연산에 의해 생성된 하나의 빈 객체를 프로토타입으로 결정한다.

리터럴 표기법으로 생성된 객체도 가상적인 생성자 함수를 가지며, 최상위 프로토타입인 Object 프로토타입과 인스턴스 사이에 또 하나의 프로토타입이 존재한다는 것이다.

프로토타입과 생성자는 단독으로 존재 할 수 없고 언제나 쌍으로 존재한다.


profile
FE 개발자 준비생 블로그 🪐

0개의 댓글