Array, Map 등과 같은 내장 클래스도 확장 가능합니다.
예를 들어, 여기서 PowerArray
기본 Array
에서 상속됩니다.
// 메소드를 하나 더 추가합니다(더 많은 작업을 수행할 수 있음) PowerArray 클래스는 Array를 확장합니다. isEmpty() { return this.length === 0; } } arr = new PowerArray(1, 2, 5, 10, 50); 경고(arr.isEmpty()); // 거짓 letfilteredArr = arr.filter(item => item >= 10); 경고(filteredArr); // 10, 50 경고(filteredArr.isEmpty()); // 거짓
매우 흥미로운 점을 참고하시기 바랍니다. filter
, map
등과 같은 내장 메소드 - 정확하게 상속된 PowerArray
유형의 새 객체를 반환합니다. 내부 구현에서는 이를 위해 객체의 constructor
속성을 사용합니다.
위의 예에서,
arr.constructor === 파워어레이
arr.filter()
호출되면 내부적으로 기본 Array
아닌 정확히 arr.constructor
사용하여 새로운 결과 배열을 생성합니다. 결과에 대해 PowerArray
메서드를 계속 사용할 수 있기 때문에 실제로 매우 좋습니다.
게다가 해당 동작을 사용자 정의할 수도 있습니다.
클래스에 특별한 정적 getter Symbol.species
추가할 수 있습니다. 존재하는 경우 JavaScript가 map
, filter
등에서 새 엔터티를 생성하기 위해 내부적으로 사용할 생성자를 반환해야 합니다.
map
이나 filter
같은 내장 메소드가 일반 배열을 반환하도록 하려면 다음과 같이 Symbol.species
에서 Array
반환할 수 있습니다.
PowerArray 클래스는 Array를 확장합니다. isEmpty() { return this.length === 0; } // 내장 메소드는 이것을 생성자로 사용합니다. 정적 get [Symbol.species]() { 배열을 반환합니다. } } arr = new PowerArray(1, 2, 5, 10, 50); 경고(arr.isEmpty()); // 거짓 // 필터는 arr.constructor[Symbol.species]를 생성자로 사용하여 새 배열을 생성합니다. letfilteredArr = arr.filter(item => item >= 10); //filteredArr은 PowerArray가 아니지만 Array입니다. 경고(filteredArr.isEmpty()); // 오류:filteredArr.isEmpty는 함수가 아닙니다.
보시다시피 이제 .filter
Array
반환합니다. 따라서 확장된 기능은 더 이상 전달되지 않습니다.
다른 컬렉션도 비슷하게 작동합니다.
Map
및 Set
과 같은 다른 컬렉션도 비슷하게 작동합니다. 그들은 또한 Symbol.species
사용합니다.
내장 객체에는 Object.keys
, Array.isArray
등과 같은 자체 정적 메서드가 있습니다.
이미 알고 있듯이 네이티브 클래스는 서로를 확장합니다. 예를 들어 Array
Object
확장합니다.
일반적으로 한 클래스가 다른 클래스를 확장하면 정적 메서드와 비정적 메서드가 모두 상속됩니다. 이는 정적 속성 및 메서드 문서에 자세히 설명되어 있습니다.
하지만 내장 클래스는 예외입니다. 그들은 서로 정적을 상속받지 않습니다.
예를 들어 Array
와 Date
모두 Object
에서 상속되므로 해당 인스턴스에는 Object.prototype
의 메서드가 있습니다. 그러나 Array.[[Prototype]]
Object
참조하지 않으므로 Array.keys()
(또는 Date.keys()
) 정적 메서드 등이 없습니다.
Date
및 Object
의 그림 구조는 다음과 같습니다.
보시다시피 Date
와 Object
사이에는 링크가 없습니다. 이들은 독립적이며 Date.prototype
만이 Object.prototype
에서 상속됩니다.
이는 extends
으로 얻는 것과 내장 객체 간의 상속에 있어서 중요한 차이점입니다.