å
建çç±»ï¼ä¾å¦ Arrayï¼Map çä¹é½æ¯å¯ä»¥æ©å±çï¼extendableï¼ã
ä¾å¦ï¼è¿éæä¸ä¸ªç»§æ¿èªåç Array çç±» PowerArrayï¼
// ç» PowerArray æ°å¢äºä¸ä¸ªæ¹æ³ï¼å¯ä»¥å¢å æ´å¤ï¼
class PowerArray extends Array {
isEmpty() {
return this.length === 0;
}
}
let arr = new PowerArray(1, 2, 5, 10, 50);
alert(arr.isEmpty()); // false
let filteredArr = arr.filter(item => item >= 10);
alert(filteredArr); // 10, 50
alert(filteredArr.isEmpty()); // false
请注æä¸ä¸ªé常æè¶£çäºå¿ãå
å»ºçæ¹æ³ä¾å¦ filterï¼map ç ââ è¿åçæ£æ¯åç±» PowerArray çæ°å¯¹è±¡ãå®ä»¬å
é¨ä½¿ç¨äºå¯¹è±¡ç constructor 屿§æ¥å®ç°è¿ä¸åè½ã
å¨ä¸é¢çä¾åä¸ï¼
arr.constructor === PowerArray
å½ arr.filter() 被è°ç¨æ¶ï¼å®çå
é¨ä½¿ç¨çæ¯ arr.constructor æ¥å建æ°çç»ææ°ç»ï¼è䏿¯ä½¿ç¨åçç Arrayãè¿ççå¾é
·ï¼å 为æä»¬å¯ä»¥å¨ç»ææ°ç»ä¸ç»§ç»ä½¿ç¨ PowerArray çæ¹æ³ã
çè³ï¼æä»¬å¯ä»¥å®å¶è¿ç§è¡ä¸ºã
æä»¬å¯ä»¥ç»è¿ä¸ªç±»æ·»å ä¸ä¸ªç¹æ®çéæ getter Symbol.speciesï¼å®ä¼è¿å JavaScript å¨å
é¨ç¨æ¥å¨ map å filter çæ¹æ³ä¸å建æ°å®ä½ç constructorã
妿æä»¬å¸æå map æ filter è¿æ ·çå
å»ºæ¹æ³è¿åå¸¸è§æ°ç»ï¼æä»¬å¯ä»¥å¨ Symbol.species ä¸è¿å Arrayï¼å°±åè¿æ ·ï¼
class PowerArray extends Array {
isEmpty() {
return this.length === 0;
}
// å
å»ºæ¹æ³å°ä½¿ç¨è¿ä¸ªä½ä¸º constructor
static get [Symbol.species]() {
return Array;
}
}
let arr = new PowerArray(1, 2, 5, 10, 50);
alert(arr.isEmpty()); // false
// filter ä½¿ç¨ arr.constructor[Symbol.species] ä½ä¸º constructor åå»ºæ°æ°ç»
let filteredArr = arr.filter(item => item >= 10);
// filteredArr 䏿¯ PowerArrayï¼èæ¯ Array
alert(filteredArr.isEmpty()); // Error: filteredArr.isEmpty is not a function
æ£å¦ä½ æçå°çï¼ç°å¨ .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 è·å¾çç»§æ¿ç¸æ¯ï¼è¿æ¯å
建对象ä¹é´ç»§æ¿çä¸ä¸ªéè¦åºå«ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼