prototype
[[Prototype]] → “프로토”
constructor
1번
2번
•
생성자 함수가 있을 때 new 연산자로 인스턴스를 만들면, 그 인스턴스에는 constructor의 ‘prototype’이라고 하는 프로퍼티의 내용이 [[Prototype]]라고 하는 프로퍼티로 참조를 전달하게 된다.
(Contstructor.prototype이랑 instance[[Prototype]]가 같은 객체를 바라본다는 말)
•
[[Prototype]]은 접근가능한 것이 아니라, 정보를 보여주기만 할 뿐으로, 실제 동작상으로는 instance와 동일시 된다. (2번 그림)
[1, 2, 3].contructor = [1, 2, 3].[[Prototype]].contructor = Array.prototype.contructor = Array
ㄴ 실제로 이렇게 접근할 수 있는건 아니고, 내부적으로 이들이 모두 같다~~
•
배열에 대해서는 Array 생성자함수와 그 프로토타입으로 이루어져 있는데, prototype에는 배열과 관련한 메서드들이 모두 들어있다.
•
하지만 숫자 또는 문자열 리터럴의 경우 숫자, 문자열 리터럴 자체는 객체가 아니므로, [[Prototype]] 프로퍼티가 없다.
그런데도 개발자가 리터럴을 인스턴스인 것처럼 사용하려고 하면(메서드를 쓰려고 하면), 자바스크립트가 임시로 숫자, 문자열 리터럴에 해당하는 Number, String 생성자 함수의 인스턴스를 만들어서 그 프로토타입에 있는 메서드를 적용해서 원하는 결과를 얻게한 다음, 다시 인스턴스를 제거하는 식으로 동작한다.
(기본형 타입의 데이터)
•
참조형 데이터들은 처음부터 인스턴스이기 때문에 메서드를 호출하는 순간에 임시로 인스턴스를 생성했다가 폐기하는 복잡한 과정을 거치지는 않는다. (ex. Function)
인스턴스로부터 prototype에 접근하려면…
•
instance.__proto__ (이 방법은 가급적이면 사용하지 말고 아래 방법으로 접근하는것이 낫다)
•
Object.getPrototypeOf(instance)
인스턴스에는 메서드가 없음에도 불구하고 [[Prototype]] 이라는 매개체 덕분에 생성자 함수의 prototype에 있는 메서드를 마치 자신의 것처럼 쓸 수 있다.
[[Prototype]]으로 이어진 각 prototype들에 모두 접근할 수 있는 것을 프로토타입 체인이라고 한다. (위 사진 빨간 점선)