자바스크립트에서 지난번 객체리터럴 방식의 문제점을 해결할 수 있는 생성자 함수에 대해 배워보았습니다. 그런데 생성자 함수에도 몇가지의 단점이 존재합니다.
만약 생성자 함수로 인스턴스를 생성하게 되면 똑같은 프로퍼티 이지만 메모리에 중복 생성 됩니다. 따라서 메모리 낭비와 퍼포먼스에 영향을 줄 수 있습니다. 이를 해결하고 싶다면 prototype 기반 상속을 구현하면 됩니다.
프로토타입
은 다른 객체에게 공유 프로퍼티
를 제공합니다. 프로토타입
은 [[Prototype]] 이라는 내부 슬롯에 저장되며, 모든 객체는 [[Prototype]] 내부슬롯을 가지고 있습니다.
funciton Animal (name){
this.name=name;
}
Animal.prototype.getName = function(){
console.log(this.name);
}
const rabit = new Animal('rabit');
혹시 결과 객체에 name과 getName 매서드가 모두 포함되어 있을꺼라고 생각하셨나요? 정답은 아닙니다. rabit을 콘솔창에 출력한 결과의 객체에는 name만 포함되어 있습니다!!
rabit 객체에 getName이 포함되어 있지 않았기 때문에 혹시 오류가 발생할 것이라고 예측할 수 있습니다. 정답은 역시나 아닙니다! 객체에 getName이 포함되어 있지 않지만 오류가 나지 않고, 정상적으로 수행됩니다.
정답은 바로 rabit의 prototype에 있습니다. rabit 객체가 생성될 때 그 원형(프로토타입)은 Animal.prototype이므로, rabit의 프로토타입인 Animal.prototype 내부에 저장되어 있는 getName을 가져올 수 있는 것입니다.
prototype = 객체 = 내부슬롯
아니요! Prototype은 내부슬롯이나 proto 접근자 프로퍼티를 사용해야 합니다.
[[Prototype]]내부의 constructor는 해당 protytpe을 가지고 있는 생성자 함수입니다.
해당하는 protytpe의
주인
이라고 할 수 있겠죠?
그건 해당 protytpe의 constructor의 constructor의 prototype입니다.