
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는 최상위 객체이기 때문에 더 이상 올라갈 수 있는 체인이 없어 에러를 던지게 됩니다. 이렇게 타고 타고 올라가는 것을 프로토타입 체이닝이라고 합니다.