👋 Symbol.species 오버라이드
Species 오버라이드
-
Symbol.species는static약세서 프로퍼티 이며getter만 있고setter는 없음class Sports extends Array { statice get [Symbol.species](){ return Array; } }; const obj = new Sports(10, 20) -
Symbol.species를 사용할 수 있는 빌트인 오브젝트- Array, Map, Set, RegExp
- Promise, ArrayBuffer, TypedArray
- 빌트인 오브젝트를 상속받은
class에Symbol.species를 작성하면 빌트인 오브젝트의@@species가 오라이드 됨 -
인스턴스 바꾸기
class Sports extends Array { statice get [Symbol.species](){ return Array; } }; const one = new Sports(10, 20, 30); console.log(one instanceof Sports); // true const two = one.slice(1, 2); console.log(two instanceof Array); // true console.log(two instanceof Sports); // falseclass Sports extends Array{}- 빌트인
Array오브젝트를 상속 받음 statice get [Symbol.species](){ return Array; }- 빌트인
Array오브젝트의@@species를 오버라이드 함 const one = new Sports(10, 20, 30);- 인스턴스를 생성함
- 파라미터 값이 인스턴스에 설정 됨
one instanceof SportsSports로one을 만들었으므로true출력const two = one.slice(1,2);Array오브젝트를 상속 받았으므로one인스턴스로slice()를 호출 할 수 있음slice()대상은 인스턴스에 설정된 [10, 20, 30]- 인스턴스를 반환하며 반환되는 인스턴스에
slice()결과를 설정함 Symbol.species()로 오버라이드 했으므로static get [Symbol.species](){}가 호출 됨- 호출에 사용한
one인스턴스 형태를 반환하지 않고Array인스턴스를 반환함 - 이처럼
Symbol.species()로 반환할 인스턴스를 변경할 수 있음 two instanceof Arraytwo인스턴스에는Array인스턴스가 할당되어 있으며Array오브젝트로 만들었으므로true출력two instacne of SportsSports가 아니라Array오브젝트로two인스턴스를 만들었으므로false출력