• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

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

답변을 작성해보세요.

1

위의 설명이 맞다면 기존에 오버라이딩 코드를 작성한 코드에서 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가 동작되는 것인가요?
==> 맞습니다.