-
카테고리
-
세부 분야
프로그래밍 언어
-
해결 여부
해결됨
Symbol.species 질문입니다.
21.01.14 11:43 작성 조회수 280
0
안녕하세요 강사님! 강의 너무 재밌게 잘 보고 있습니다.
Symbol.species 강의를 듣다가 조금 이해가 안되는 부분이 있어서 문의 드립니다.
class Sports extends Array {
static get [Symbol.species]() {
return Array;
}
}
const one = new Sports(10,20,30);
const two = one.slice(1,2);
여기서 one에는 class Sports의 인스턴스를 생성하여 one에 전달하는데 Array를 상속받아 slice를 사용할 수 있고,
이후 two에는 slice()의 결과값만 대입하는 것이 아닌, constructor가 없더라도 @@species가 동작되어 인스턴스를 반환하지만 static get [Symbol.species]를 작성하였기에, 오버라이딩되어 반환값을 Array Object로 생성한 인스턴스를 반환했다고 이해했습니다.
그래서 one의 경우 Array를 상속받은 class Sports로 생성하여
log(one instanseOf Array) // true
log(one instanseOf Sports) // true
로 확인됩니다. Sports Class로 생성된 인스턴스 이며, Array Obeject의 prototype을 상속받았기 때문에 위 결과가 나온것으로 판단됩니다.
이후 two의 경우
log(two instanseOf Array) // true
log(two instanseOf Sports)// false
one은 생성된 인스턴스로 prototype이 없지만, slice()는 결과값만 전달하는 것이아닌 @@specise의 결과로 인스턴스를 생성하여 반환하는것인데, one 인스턴스에서 [Symbol.species]를 작성하였기 때문에 오버라이딩 되어 Array Object의 인스턴스로 생성된 값을 반환 받은것으로 이해했습니다. 그래서 two의 결과로 Array는 true, Sports는 false로 나온것이구요,
여기서 질문은
[Symbol.species]를 제외하여 오버라이딩 하지않은 class Sports extends Array {}; 로 변경하여 테스트한 경우
one instanseOf Array, one instanseOf Sports
two instanseOf Array, two instanseOf Sports의 결과로 one, two 모두 true더군요,
[Symbol.specise] 작성 시 : Array Object의 인스턴스를 생성하여 반환
[Symbol.specise] 미 작성 시 : 오버라이딩 하지않고 defalut로 @@species가 동작 (class Sports extends Array로 생성한 인스턴스 반환)
위의 설명이 맞다면 기존에 오버라이딩 코드를 작성한 코드에서 const one = new Sports(10, 20)으로 인스턴스를 생성할때는 Symbol.species가 동작되지 않는건가요?
one.slice의 결과값을 담을 인스턴스를 생성할때에만 Symbol.species가 동작되는 것인가요?
위 글에서 질문외에 제가 이해한 부분 중 틀린부분이 있다면 번거러우시겠지만 설명 부탁드립니다ㅜ
답변을 작성해보세요.
1
김영보
지식공유자2021.01.14
위의 설명이 맞다면 기존에 오버라이딩 코드를 작성한 코드에서 const one = new Sports(10, 20)으로 인스턴스를 생성할때는 Symbol.species가 동작되지 않는건가요?
==> 맞습니다. 아래처럼 debugger를 작성하고 실행해 보면 알 수 있습니다.
new Sports(10, 20, 30)을 하면 Sports.prototype.constructor를 호출하여 prototype으로 인스턴스를 생성합니다. Symbol.species를 체크하지 않습니다.
debugger;
class Sports extends Array{...}
one.slice의 결과값을 담을 인스턴스를 생성할때에만 Symbol.species가 동작되는 것인가요?
==> 맞습니다.
답변 1