Array[Symbol.species]
åºçº¿
广æ³å¯ç¨
èª 2020å¹´1æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
Array[Symbol.species] éæè®¿é®å¨å±æ§è¿åæé 彿°ï¼æé 彿°ç¨äºæé æ°ç»æ¹æ³è¿åå¼ã
è¦åï¼[Symbol.species] çåå¨å
许æ§è¡ä»»æä»£ç ï¼è¿å¯è½ä¼äº§çå®å
¨æ¼æ´ãå®è¿ä¼ä½¿æäºä¼åå徿´å å°é¾ã弿å¼åè
æ£å¨è°æ¥æ¯å¦è¦ç§»é¤æ¤ç¹æ§ã妿å¯è½ï¼è¯·é¿å
ä¾èµå®ãç°ä»£æ°ç»æ¹æ³ï¼å¦ toReversed()ï¼ä¸ä½¿ç¨ [Symbol.species] ä¸å§ç»è¿åä¸ä¸ªæ°ç Array åºç±»å®ä¾ã
è¯æ³
Array[Symbol.species]
è¿åå¼
get [Symbol.species] 被è°ç¨çæé 彿°ï¼thisï¼çå¼ã该è¿åå¼ç¨äºæé åå»ºæ°æ°ç»çæ°ç»æ¹æ³çè¿åå¼ã
æè¿°
[Symbol.species] 访é®å¨å±æ§è¿å Array 对象çé»è®¤æé 彿°ãåç±»çæé 彿°å¯è½ä¼è¦çå¹¶æ¹åæé 彿°çèµå¼ãé»è®¤å®ç°åºæ¬ä¸æ¯è¿æ ·çï¼
// 以䏿¯ä¸ä¸ªç¨äºè¯´æçå设åºå±å®ç°
class Array {
static get [Symbol.species]() {
return this;
}
}
ç±äºè¿ç§å¤æå®ç°ï¼æ´¾çåç±»ç [Symbol.species] é»è®¤æ
åµä¸ä¹ä¼è¿åæé 彿°æ¬èº«ã
class SubArray extends Array {}
SubArray[Symbol.species] === SubArray; // true
è°ç¨ä¸ä¼æ¹åç°ææ°ç»ä½ä¼è¿åæ°æ°ç»å®ä¾çæ°ç»æ¹æ³æ¶ï¼ä¾å¦ filter() å map()ï¼ï¼å°è®¿é®æ°ç»ç constructor[Symbol.species]ãè¿åçæé 彿°å°ç¨äºæé æ°ç»æ¹æ³çè¿åå¼ãè¿ä½¿å¾å¨ææ¯ä¸ä½¿æ°ç»æ¹æ³è¿å䏿°ç»æ å
³ç对象æä¸ºå¯è½ã
class NotAnArray {
constructor(length) {
this.length = length;
}
}
const arr = [0, 1, 2];
arr.constructor = { [Symbol.species]: NotAnArray };
arr.map((i) => i); // NotAnArray { '0': 0, '1': 1, '2': 2, length: 3 }
arr.filter((i) => i); // NotAnArray { '0': 1, '1': 2, length: 0 }
arr.concat([1, 2]); // NotAnArray { '0': 0, '1': 1, '2': 2, '3': 1, '4': 2, length: 5 }
示ä¾
>æ®é对象ä¸ç species
[Symbol.species] 屿§è¿åé»è®¤æé 彿°ï¼å¯¹äº Array æ¥è¯´ï¼å®å°±æ¯ Array æé 彿°ã
Array[Symbol.species]; // [Function: Array]
æ´¾ç对象ä¸ç species
å¨èªå®ä¹ Array åç±»çå®ä¾ä¸ï¼ä¾å¦ MyArrayï¼ï¼MyArray ç species æ¯ MyArray æé 彿°ãä¸è¿ï¼ä½ å¯è½æ³è¦éåè¿ä¸ªæ¹æ³ï¼ä»¥ä¾¿å¨æ´¾çç±»æ¹æ³ä¸è¿åç¶çº§ Array 对象ï¼
class MyArray extends Array {
// éå MyArray ç species 屿§å°ç¶ç±» Array çæé 彿°
static get [Symbol.species]() {
return Array;
}
}
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-get-array-%symbol.species%> |