home
자바
home
🍎

프로토타입

강의명
코어 자바스크립트
강의순서
6
과목
⚽자바스크립트
수강상태
완료
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들에 모두 접근할 수 있는 것을 프로토타입 체인이라고 한다. (위 사진 빨간 점선)