[빌트인 객체]
const Cls = function(){}
Cls.prototype = Object.create(Array.prototype);
const arr = new Cls;
arr[0] = 'test';
arr.length; //0 소용없음!
const Cls = class extends Array{};
const arr = new Cls;
arr[0] = 'test';
arr.length; //1
이걸 가능케 하는 메커니즘
constructor
의 두가지 종류
기본(base) 생성자
파생(derived) 생성자
- 상속받은 Cls는 class기 때문에 파생 생성자로 생성
//1. 빌트인객체의 프로토타입
const a = new Array(); //생성자의 프로토타입이 Array.prototype임
//생성자 Array의 prototype은 Array.prototype
//2. 그 외의 사용자정의 클래스의 프로토타입
const Cls = function(){};
const b = new Cls(); //생성자의 프로토타입이 Function.prototype임
//Cls의 prototype은 Function.prototype
빌트인 객체 상속시 생기는 일
const Cls = class extends Array{
constructor(length){
super(length);
}
};
- ECrecord 에 저장되는 정보
- 부모인 Array의 경우
- 생성자 종류 – 기본(base) 생성자
- 생성자의 프로토타입 – Array.prototype
- 자식인 Cls의 경우
- 생성자 종류 – 파생(derived) 생성자
- 생성자의 프로토타입 – Function.prototype
- es6에서는 class구문으로 클래스를 생성하면 상속되는 경우 자식 클래스로 인스턴스를 생성하지 않고 기본 생성자를 거슬러 올라가 그 기본 생성자로 객체를 생성하므로 빌트인 객체를 생성할 수 있다
const Cls = class extends Array{
constructor(){
if(classKind == 'base'){ //본인 기본생성자라면 this는 본인이 생성하지만
this = Object.create(new.target.prototype);
}else{ //아니라면 부모에게 위임하자. 하지만 new.target은 유지한다.
this = Reflect.construct(Array, [], new.target);
}
}
};
정리
- 기존의 경우 인스턴스가 무조건 자식 클래스로 생성되는데 반해,
- class문을 이용한 객체 생성은
기본 생성자
에게 객체 생성을 위임
하기 때문에,
- 빌트인 클래스를 상속한 경우
빌트인 클래스가 기본 생성자
가 되니,
- 우선 객체는
빌트인 클래스로 생성
하되,