function Person(name, age) { // 생성자 함수
this.name = name;
this.age = age;
}
const jennie = new Person('jennie', 20); // 인스턴스
const lisa = new Person('lisa', 20); // 인스턴스
[[Prototype]]
생성자 함수
가 있을 때 new 연산자로 인스턴스를 생성
하면 그 인스턴스에는 constuctor의 porototype의 프로퍼티 내용이 [[Prototype]]
라고 하는 프로퍼티로 참조를 전달하게 됩니다.constructor.prototype
과 instance[[Prototype]]
은 같은 객체를 바라봅니다.[[Prototype]]
은 접근이 가능한 것이 아니라 정보를 보여주기만 합니다.아래 화면과 같이 생성자 함수 Array
를 개발자 도구에서 출력하면 porototype
을 확인할 수 있습니다.
이 porototype
은 인스턴스 배열 arr의
[[Prototype]]
과 연결됩니다.
Array.prototype.constructor
와 arr.constructor
는 같은 배열의 생성자 함수를 가리킵니다.[[Prototype]]
을 통해 메소드를 사용할 수 있습니다.인스턴스가 생성장 함수의 prototype에 접근하려면?
Object.getPrototypeOf(instance)
아래 소스와 같이 프로토타입으로 메소드를 만들면 인스턴스들을 계속 만들어도 한번 만들어 놓은 프로토타입 메소드를 참조하면서 메모리 사용 효율을 끌어올릴 수 있는 장점이 있습니다.
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.setAge = function () {
this.age += 1;
};
Person.prototype.getAge = function () {
return this.age;
};
const jennie = new Person("jennie", 20);
const lisa = new Person("lisa", 20);
jennie.setAge(); // 21
lisa.setAge(); // 21
예를 들어, [1, 2, 3]. method()
어떠한 메소드를 호출한다고 했을 때 먼저 인스턴스 자기 자신에서 먼저 찾고, 없다면 프로토타입을 체이닝을 타고 올라가 Array.prototype
에서 메소드를 찾습니다. 해당 메소드가 있다면 메소드를 호출하고 끝내지만 만약 없다면, 한 단계 더 타고 올라가 Object.prototype
에서 메소드를 찾고 해당 메소드가 있다면 메소드를 호출하고 없다면 Object는 최상위 객체이기 때문에 더 이상 올라갈 수 있는 체인이 없어 에러를 던지게 됩니다. 이렇게 타고 타고 올라가는 것을 프로토타입 체이닝이라고 합니다.