JavaScriptã®Symbol.speciesãæ¢æ±ããæŽŸçãªããžã§ã¯ãã®ã³ã³ã¹ãã©ã¯ã¿åäœãå¶åŸ¡ãå ç¢ãªã¯ã©ã¹èšèšãšé«åºŠãªã©ã€ãã©ãªéçºã«äžå¯æ¬ ãªæ©èœã§ãã
ã³ã³ã¹ãã©ã¯ã¿ã®ã«ã¹ã¿ãã€ãºãè§£ãæããïŒJavaScriptã®Symbol.species詳现解説
åºå€§ã§é²åãç¶ããçŸä»£ã®JavaScriptéçºã®äžçã«ãããŠãå ç¢ã§ä¿å®æ§ãé«ããäºæž¬å¯èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšã¯æ¥µããŠéèŠãªåãçµã¿ã§ãããã®èª²é¡ã¯ãè€éãªã·ã¹ãã ãèšèšããããã°ããŒãã«ãªå©çšè ã察象ãšããã©ã€ãã©ãªãäœæãããããéã«ç¹ã«é¡èã«ãªããŸããããã§ã¯ã倿§ãªããŒã ãããŸããŸãªæè¡çèæ¯ããããŠãã°ãã°åæ£ããéçºç°å¢ãæ··åšããŸãããªããžã§ã¯ããã©ã®ããã«æ¯ãèããçžäºäœçšãããã«ãããæ£ç¢ºæ§ã¯ãåãªããã¹ããã©ã¯ãã£ã¹ã§ã¯ãªããå®å®æ§ãšã¹ã±ãŒã©ããªãã£ã®ããã®åºæ¬çãªèŠä»¶ãªã®ã§ãã
ãã®ã¬ãã«ã®ãã现ããªå¶åŸ¡ãéçºè ãéæã§ããããã«ãããJavaScriptã®åŒ·åã§ãããªãããã°ãã°éå°è©äŸ¡ãããŠããæ©èœã®äžã€ãSymbol.speciesã§ããECMAScript 2015 (ES6)ã®äžéšãšããŠå°å ¥ããããã®well-knownã·ã³ãã«ã¯ãçµã¿èŸŒã¿ã¡ãœãããæŽŸçãªããžã§ã¯ãããæ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããéã«å©çšããã³ã³ã¹ãã©ã¯ã¿é¢æ°ãã«ã¹ã¿ãã€ãºããããã®æŽç·Žãããã¡ã«ããºã ãæäŸããŸããããã«ãããç¶æ¿ãã§ãŒã³ãæ£ç¢ºã«ç®¡çããã³ãŒãããŒã¹å šäœã§åã®äžè²«æ§ãšäºæž¬å¯èœãªçµæãä¿èšŒããããšãã§ããŸããå€§èŠæš¡ã§è€éãªãããžã§ã¯ãã§åæ¥ããåœéçãªããŒã ã«ãšã£ãŠãSymbol.speciesã®æ·±ãçè§£ãšè³¢æãªæŽ»çšã¯ãçžäºéçšæ§ãåçã«åäžãããäºæãã¬åé¢é£ã®åé¡ã軜æžããããä¿¡é Œæ§ã®é«ããœãããŠã§ã¢ãšã³ã·ã¹ãã ãè²ãããšãã§ããŸãã
ãã®å æ¬çãªã¬ã€ãã§ã¯ãSymbol.speciesã®æ·±æ·µãæ¢æ±ããŸãããã®åºæ¬çãªç®çãäžå¯§ã«è§£ãæãããå®è·µçã§åãããããäŸãéããŠè§£èª¬ããã©ã€ãã©ãªäœæè ããã¬ãŒã ã¯ãŒã¯éçºè ã«ãšã£ãŠäžå¯æ¬ ãªé«åºŠãªãŠãŒã¹ã±ãŒã¹ãæ€èšŒããéèŠãªãã¹ããã©ã¯ãã£ã¹ãæŠèª¬ããŸããç§ãã¡ã®ç®çã¯ãåã«å埩åããã髿§èœã§ããã ãã§ãªããéçºå ããããã€å ã«é¢ããããæ¬è³ªçã«äºæž¬å¯èœã§ã°ããŒãã«ã«äžè²«æ§ã®ããã¢ããªã±ãŒã·ã§ã³ãäœæããããã®ç¥èãçããã«æäŸããããšã§ããJavaScriptã®ãªããžã§ã¯ãæåèœåãžã®çè§£ãæ·±ããã¯ã©ã¹éå±€ã«å¯ŸããåäŸã®ãªãã¬ãã«ã®å¶åŸ¡ãè§£ãæŸã€æºåãããŠãã ããã
çŸä»£JavaScriptã«ãããã³ã³ã¹ãã©ã¯ã¿ãã¿ãŒã³ã®ã«ã¹ã¿ãã€ãºã®å¿ èŠæ§
JavaScriptã«ããããªããžã§ã¯ãæåããã°ã©ãã³ã°ã¯ããããã¿ã€ããšããçŸä»£çãªã¯ã©ã¹æ§æã«æ¯ããããŠãããã³ã³ã¹ãã©ã¯ã¿ãšç¶æ¿ã«å€§ããäŸåããŠããŸããArrayãRegExpãPromiseãšãã£ãã³ã¢çµã¿èŸŒã¿ã¯ã©ã¹ãæ¡åŒµããå ŽåãæŽŸçã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãç¬èªã®æ©èœåŒ·åãæã¡ã€ã€ãã芪ã¯ã©ã¹ãšã»ãŒåæ§ã«æ¯ãèãããšãèªç¶ã«æåŸ ãããŸããããããæŽŸçã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹äžã§åŒã³åºãããç¹å®ã®çµã¿èŸŒã¿ã¡ãœããããæŽŸçã¯ã©ã¹ã®çš®å¥ãç¶æããã®ã§ã¯ãªããããã©ã«ãã§åºåºã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãè¿ããŠããŸããšããã埮åŠãªãããé倧ãªèª²é¡ãæµ®äžããŸãããã®äžèŠäºçŽ°ãªæåã®éžè±ã¯ãå€§èŠæš¡ã§è€éãªã·ã¹ãã å ã§æ·±å»ãªåã®äžè²«æ§ã®æ¬ åŠãåŒãèµ·ãããçºèŠãå°é£ãªãã°ãæ··å ¥ãããå¯èœæ§ããããŸãã
ãçš®å¥ã®åªå€±ãçŸè±¡ïŒé ããå±éº
ãã®ãçš®å¥ã®åªå€±ããå ·äœçãªäŸã§èª¬æããŸããããã°ããŒãã«ãªéèã¢ããªã±ãŒã·ã§ã³ã«ãããŠãç¹å®ã®ããŒã¿æ§é ã®ããã«ãå ç¢ãªãã®ã³ã°ããç°ãªãèŠå¶å°åéã§ã®ã³ã³ãã©ã€ã¢ã³ã¹ã«äžå¯æ¬ ãªç¹å®ã®ããŒã¿æ€èšŒã«ãŒã«ã远å ãããã«ã¹ã¿ã ã®é å颚ã¯ã©ã¹ãéçºããŠãããšæ³åããŠãã ããã
class SecureTransactionList extends Array { constructor(...args) { super(...args); console.log('SecureTransactionListã€ã³ã¹ã¿ã³ã¹ãäœæãããç£æ»ã®æºåãã§ããŸããã'); this.auditLog = []; } addTransaction(transaction) { this.push(transaction); this.auditLog.push(`远å ããããã©ã³ã¶ã¯ã·ã§ã³: ${JSON.stringify(transaction)}`); console.log(this.auditLog[this.auditLog.length - 1]); } getAuditReport() { return `ãã©ã³ã¶ã¯ã·ã§ã³${this.length}ä»¶ã®ç£æ»ã¬ããŒã:\n${this.auditLog.join('\n')}`; } }
ã§ã¯ãã€ã³ã¹ã¿ã³ã¹ãäœæãããã®ã«ã¹ã¿ã ãªã¹ãã«å¯ŸããŠmap()ã®ãããªäžè¬çãªé å倿ãå®è¡ããŠã¿ãŸãããã
const dailyTransactions = new SecureTransactionList(); dailyTransactions.addTransaction({ id: 'TRN001', amount: 100, currency: 'USD' }); dailyTransactions.addTransaction({ id: 'TRN002', amount: 75, currency: 'EUR' }); console.log(dailyTransactions.getAuditReport()); const processedTransactions = dailyTransactions.map(t => ({ ...t, processed: true })); console.log(processedTransactions instanceof SecureTransactionList); // æåŸ å€: true, å®é: false console.log(processedTransactions instanceof Array); // æåŸ å€: true, å®é: true // console.log(processedTransactions.getAuditReport()); // ãšã©ãŒ: processedTransactions.getAuditReport is not a function
å®è¡ãããšãprocessedTransactionsãSecureTransactionListã§ã¯ãªãããã ã®Arrayã€ã³ã¹ã¿ã³ã¹ã§ããããšã«ããã«æ°ã¥ãã§ããããmapã¡ãœããã¯ããã®ããã©ã«ãã®å éšã¡ã«ããºã ã«ãããå ã®Arrayã®ã³ã³ã¹ãã©ã¯ã¿ãåŒã³åºããŠæ»ãå€ãäœæããŸãããããã«ãããæŽŸçã¯ã©ã¹ã®ã«ã¹ã¿ã ç£æ»æ©èœãããããã£ïŒauditLogãgetAuditReport()ãªã©ïŒãäºå®äžåãé€ãããäºæãã¬åã®äžäžèŽãçããŸããã·ã³ã¬ããŒã«ããã©ã³ã¯ãã«ãããã¥ãŒãšãŒã¯ã®ãšã³ãžãã¢ãªã©ãã¿ã€ã ãŸãŒã³ãè¶ããŠåæ£ããéçºããŒã ã«ãšã£ãŠããã®åã®åªå€±ã¯äºæž¬äžå¯èœãªæ¯ãèããšããŠçŸããåŸç¶ã®ã³ãŒããSecureTransactionListã®ã«ã¹ã¿ã ã¡ãœããã«äŸåããŠããå Žåããã©ã¹ãã¬ãŒã·ã§ã³ã®ããŸããããã°ã»ãã·ã§ã³ãæœåšçãªããŒã¿æŽåæ§ã®åé¡ã«ã€ãªããå¯èœæ§ããããŸãã
åã®äºæž¬å¯èœæ§ãããããã°ããŒãã«ãªåœ±é¿
ãã€ã¯ããµãŒãã¹ãå ±æã©ã€ãã©ãªããããŠç°ãªãããŒã ãå°åããã®ãªãŒãã³ãœãŒã¹ã³ã³ããŒãã³ããã·ãŒã ã¬ã¹ã«çžäºéçšããªããã°ãªããªããã°ããŒãã«åããçžäºæ¥ç¶ããããœãããŠã§ã¢éçºã®çŸå Žã«ãããŠã絶察çãªåã®äºæž¬å¯èœæ§ãç¶æããããšã¯ãæçã§ããã ãã§ãªããæ»æŽ»åé¡ã§ããããå€§äŒæ¥ã§ã®ã·ããªãªãèããŠã¿ãŸãããããã³ã¬ããŒã«ã®ããŒã¿åæããŒã ããValidatedDataSetïŒæŽåæ§ãã§ãã¯æ©èœãæã€ã«ã¹ã¿ã ã®Arrayãµãã¯ã©ã¹ïŒãæåŸ ããã¢ãžã¥ãŒã«ãéçºãããšããŸãããããããããªã³ã®ããŒã¿å€æãµãŒãã¹ããæ°ã¥ããã«ããã©ã«ãã®é åã¡ãœããã䜿çšããæ±çšçãªArrayãè¿ããŠããŸããŸããããã®äžäžèŽã¯ãäžæµã®æ€èšŒããžãã¯ã壿» çã«ç Žå£ããéèŠãªããŒã¿ã³ã³ãã©ã¯ããç¡å¹ã«ããç°ãªãããŒã ãå°ççãªå¢çãè¶ããŠèšºæã»ä¿®æ£ããã®ãéåžžã«å°é£ã§ã³ã¹ãã®ããããšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãããã®ãããªåé¡ã¯ããããžã§ã¯ãã®ã¿ã€ã ã©ã€ã³ã«é倧ãªåœ±é¿ãäžããã»ãã¥ãªãã£ã®è匱æ§ãçã¿åºãããœãããŠã§ã¢ã®ä¿¡é Œæ§ãæãªãå¯èœæ§ããããŸãã
Symbol.speciesã察åŠããæ žå¿çãªåé¡
Symbol.speciesã解決ããããã«èšèšãããæ ¹æ¬çãªåé¡ã¯ããã®çµã¿èŸŒã¿æäœäžã®ãçš®å¥ã®åªå€±ãã§ããJavaScriptã«ã¯ãArrayã ãã§ãªããRegExpãPromiseãªã©ãå€ãã®çµã¿èŸŒã¿ã¡ãœããããããããã®åã®æ°ããã€ã³ã¹ã¿ã³ã¹ãçæããããã«èšèšãããŠããŸãããã®æ¯ãèããäžæžããŸãã¯ã«ã¹ã¿ãã€ãºããããã®æç¢ºã§ã¢ã¯ã»ã¹å¯èœãªã¡ã«ããºã ããªããã°ããããã®çµã¿èŸŒã¿ãªããžã§ã¯ããæ¡åŒµããã«ã¹ã¿ã ã¯ã©ã¹ã¯ãè¿ããããªããžã§ã¯ãã«ç¬èªã®ããããã£ãã¡ãœãããååšããªãããšã«æ°ã¥ãããããã®ç¹å®ã®ããããé »ç¹ã«äœ¿çšãããæäœã«ãããŠãç¶æ¿ã®æ¬è³ªãšæçšæ§ãã®ãã®ãæãªãããšã«ãªããŸãã
çµã¿èŸŒã¿ã¡ãœãããã³ã³ã¹ãã©ã¯ã¿ã«äŸåããä»çµã¿
Array.prototype.mapã®ãããªã¡ãœãããåŒã³åºããããšãJavaScriptãšã³ãžã³ã¯å€æãããèŠçŽ ã®ããã®æ°ããé åãäœæããå éšã«ãŒãã³ãå®è¡ããŸãããã®ã«ãŒãã³ã®äžéšã«ã¯ããã®æ°ããã€ã³ã¹ã¿ã³ã¹ã«äœ¿çšããã³ã³ã¹ãã©ã¯ã¿ã®æ€çŽ¢ãå«ãŸããŸããããã©ã«ãã§ã¯ããããã¿ã€ããã§ãŒã³ãé¡ããéåžžã¯ã¡ãœãããåŒã³åºãããã€ã³ã¹ã¿ã³ã¹ã®çŽæ¥ã®èŠªã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãå©çšããŸããç§ãã¡ã®SecureTransactionListã®äŸã§ã¯ããã®èŠªã¯æšæºã®Arrayã³ã³ã¹ãã©ã¯ã¿ã§ãã
ECMAScript仿§ã§ææåããããã®ããã©ã«ãã¡ã«ããºã ã¯ãçµã¿èŸŒã¿ã¡ãœãããå ç¢ã§ãããåºç¯ãªã³ã³ããã¹ãã§äºæž¬å¯èœã«åäœããããšãä¿èšŒããŸããããããé«åºŠãªã¯ã©ã¹äœæè ãç¹ã«è€éãªãã¡ã€ã³ã¢ãã«ã匷åãªãŠãŒãã£ãªãã£ã©ã€ãã©ãªãæ§ç¯ãã人ã ã«ãšã£ãŠããã®ããã©ã«ãã®æ¯ãèãã¯ãå®å šã«æ©èœããåãä¿æãããµãã¯ã©ã¹ãäœæããäžã§é倧ãªå¶çŽãšãªããŸããããã«ãããéçºè ã¯åé¿çãåãããçæ³çãšã¯èšããªãåã®æµåæ§ãåãå ¥ããããšãäœåãªããããŸãã
Symbol.speciesã®å°å ¥ïŒã³ã³ã¹ãã©ã¯ã¿ã®ã«ã¹ã¿ãã€ãºããã¯
Symbol.speciesã¯ãECMAScript 2015 (ES6)ã§å°å ¥ãããç»æçãªwell-knownã·ã³ãã«ã§ãããã®äžå¿çãªäœ¿åœã¯ãçµã¿èŸŒã¿ã¡ãœãããæŽŸçã¯ã©ã¹ããæ°ããã€ã³ã¹ã¿ã³ã¹ãçæããéã«ã©ã®ã³ã³ã¹ãã©ã¯ã¿é¢æ°ã䜿çšãã¹ããããã¯ã©ã¹äœæè ãæ£ç¢ºã«å®çŸ©ã§ããããã«ããããšã§ããããã¯ãã¯ã©ã¹ã«å®£èšããéçãªã²ãã¿ãŒããããã£ãšããŠçŸãããã®ã²ãã¿ãŒã«ãã£ãŠè¿ãããã³ã³ã¹ãã©ã¯ã¿é¢æ°ããçµã¿èŸŒã¿æäœã«ããããçš®å¥ã³ã³ã¹ãã©ã¯ã¿ããšãªããŸãã
æ§æãšæŠç¥çãªé 眮
Symbol.speciesã®å®è£ ã¯æ§æçã«ç°¡åã§ããã¯ã©ã¹å®çŸ©ã«[Symbol.species]ãšããååã®éçãªã²ãã¿ãŒããããã£ã远å ããŸãããã®ã²ãã¿ãŒã¯ã³ã³ã¹ãã©ã¯ã¿é¢æ°ãè¿ããªããã°ãªããŸãããæŽŸçããåãç¶æããããã®æãäžè¬çã§ããã°ãã°æãæãŸããæ¯ãèãã¯ãåã«thisãè¿ãããšã§ããããã¯çŸåšã®ã¯ã©ã¹èªèº«ã®ã³ã³ã¹ãã©ã¯ã¿ãæããããã«ãã£ãŠãã®ãçš®å¥ããä¿æããŸãã
class MyCustomType extends BaseType { static get [Symbol.species]() { return this; // ããã«ãããçµã¿èŸŒã¿ã¡ãœãããMyCustomTypeã®ã€ã³ã¹ã¿ã³ã¹ãè¿ãããšãä¿èšŒããã } // ... ã«ã¹ã¿ã ã¯ã©ã¹å®çŸ©ã®æ®ã }
ããã§ã¯ãSecureTransactionListã®äŸã«æ»ããSymbol.speciesãé©çšããŠããã®å€é©çãªåãç®ã®åœããã«ããŸãããã
å®è·µã«ãããSymbol.speciesïŒåã®æŽåæ§ã®ç¶æ
Symbol.speciesã®å®è·µçãªé©çšã¯ãšã¬ã¬ã³ãã§ãéåžžã«åœ±é¿åããããŸãããã®éçãªã²ãã¿ãŒã远å ããã ãã§ãJavaScriptãšã³ãžã³ã«å¯ŸããŠæç¢ºãªæç€ºãäžããããšãã§ããçµã¿èŸŒã¿ã¡ãœãããåºåºã¯ã©ã¹ã«æ»ãã®ã§ã¯ãªããæŽŸçã¯ã©ã¹ã®åãå°éãç¶æããããšãä¿èšŒããŸãã
äŸ1ïŒArrayãµãã¯ã©ã¹ã§ã®çš®å¥ã®ä¿æ
SecureTransactionListãæ¹è¯ããŠãé åæäœåŸã«æ£ããèªèº«ã®ã€ã³ã¹ã¿ã³ã¹ãè¿ãããã«ããŸãããã
class SecureTransactionList extends Array { static get [Symbol.species]() { return this; // éèŠïŒçµã¿èŸŒã¿ã¡ãœãããSecureTransactionListã®ã€ã³ã¹ã¿ã³ã¹ãè¿ãããšãä¿èšŒãã } constructor(...args) { super(...args); console.log('SecureTransactionListã€ã³ã¹ã¿ã³ã¹ãäœæãããç£æ»ã®æºåãã§ããŸããã'); this.auditLog = []; } addTransaction(transaction) { this.push(transaction); this.auditLog.push(`远å ããããã©ã³ã¶ã¯ã·ã§ã³: ${JSON.stringify(transaction)}`); console.log(this.auditLog[this.auditLog.length - 1]); } getAuditReport() { return `ãã©ã³ã¶ã¯ã·ã§ã³${this.length}ä»¶ã®ç£æ»ã¬ããŒã:\n${this.auditLog.join('\n')}`; } }
ã§ã¯ã倿æäœãå床å®è¡ããæ±ºå®çãªéãã芳å¯ããŠã¿ãŸãããã
const dailyTransactions = new SecureTransactionList(); dailyTransactions.addTransaction({ id: 'TRN001', amount: 100, currency: 'USD' }); dailyTransactions.addTransaction({ id: 'TRN002', amount: 75, currency: 'EUR' }); console.log(dailyTransactions.getAuditReport()); const processedTransactions = dailyTransactions.map(t => ({ ...t, processed: true })); console.log(processedTransactions instanceof SecureTransactionList); // æåŸ å€: true, å®é: true (ð) console.log(processedTransactions instanceof Array); // æåŸ å€: true, å®é: true console.log(processedTransactions.getAuditReport()); // åäœããïŒããã©ã³ã¶ã¯ã·ã§ã³2ä»¶ã®ç£æ»ã¬ããŒã:...ããè¿ãããã«ãªã
Symbol.speciesã®ããã®ãããæ°è¡ã®è¿œå ã§ãç§ãã¡ã¯çš®å¥åªå€±ã®åé¡ãæ ¹æ¬çã«è§£æ±ºããŸããïŒprocessedTransactionsã¯ä»ãæ£ããSecureTransactionListã®ã€ã³ã¹ã¿ã³ã¹ãšãªãããã®ãã¹ãŠã®ã«ã¹ã¿ã ç£æ»ã¡ãœãããšããããã£ãä¿æããŠããŸããããã¯ãç¹ã«ããŒã¿ã¢ãã«ãç°ãªãå°ççãŸãŒã³ãã³ã³ãã©ã€ã¢ã³ã¹èŠä»¶ã«ããã£ãŠå³æ Œã«å®çŸ©ã»æ€èšŒããã忣ã·ã¹ãã å ã§ã®è€éãªããŒã¿å€æã«ãããŠãåã®æŽåæ§ãç¶æããããã«çµ¶å¯Ÿçã«äžå¯æ¬ ã§ãã
ãã现ãããªã³ã³ã¹ãã©ã¯ã¿å¶åŸ¡ïŒreturn thisãè¶ ããŠ
return this;ã¯Symbol.speciesã®æãäžè¬çã§ãã°ãã°æãŸãããŠãŒã¹ã±ãŒã¹ã§ãããä»»æã®ã³ã³ã¹ãã©ã¯ã¿é¢æ°ãè¿ãæè»æ§ã«ãããããè€éãªå¶åŸ¡ãå¯èœã«ãªããŸãã
- return this; (掟ççš®å¥ã®ããã©ã«ã): å®èšŒããããã«ãããã¯çµã¿èŸŒã¿ã¡ãœããã«å³å¯ãªæŽŸçã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãè¿ããããå Žåã«çæ³çãªéžæè¢ã§ããããã«ããã匷åãªåã®äžè²«æ§ãä¿é²ãããã«ã¹ã¿ã åã§ã®ã·ãŒã ã¬ã¹ã§åãä¿æããæäœã®é£éãå¯èœã«ãªããæµãããããªAPIãè€éãªããŒã¿ãã€ãã©ã€ã³ã«ãšã£ãŠéèŠã§ãã
- return BaseClass; (åºåºåã匷å¶ãã): ç¹å®ã®èšèšã·ããªãªã§ã¯ãæå³çã«çµã¿èŸŒã¿ã¡ãœãããåºåºã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ïŒäŸïŒãã¬ãŒã³ãªArrayãPromiseïŒãè¿ãããšã奜ãå ŽåããããŸããããã¯ã掟çã¯ã©ã¹ãäž»ãšããŠäœææãåæåŠçäžã®ç¹å®ã®æ¯ãèãã®ããã®äžæ¬¡çãªã©ãããŒãšããŠæ©èœããã¡ã¢ãªãæé©åããããäžæµã®åŠçãåçŽåããããçžäºéçšæ§ã®ããã«ã·ã³ãã«ãªã€ã³ã¿ãŒãã§ãŒã¹ã«å³å¯ã«åŸã£ããããããã«ãæšæºçãªå€æäžã«ã©ãããŒããè±ãæšãŠãããå Žåã«äŸ¡å€ããããŸãã
- return AnotherClass; (代æ¿ã³ã³ã¹ãã©ã¯ã¿ãžã®ãªãã€ã¬ã¯ã): é«åºŠã«é«åºŠãªããŸãã¯ã¡ã¿ããã°ã©ãã³ã°ã®æèã§ã¯ãçµã¿èŸŒã¿ã¡ãœããã«å šãç°ãªãããããæå³çã«äºææ§ã®ããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãè¿ããããå ŽåããããŸããããã¯ãåçãªå®è£ ã®åãæ¿ããæŽç·Žããããããã·ãã¿ãŒã³ã«äœ¿çšã§ããŸãããããããã®éžæè¢ã¯ã察象ã¯ã©ã¹ãæäœã®æåŸ ãããæ¯ãèããšå®å šã«äºææ§ããªãå Žåãäºæãã¬åã®äžäžèŽãå®è¡æãšã©ãŒã®ãªã¹ã¯ãèããå¢å ããããããæå€§éã®æ³šæãå¿ èŠã§ãã培åºçãªããã¥ã¡ã³ããŒã·ã§ã³ãšå³æ Œãªãã¹ãã¯ãããã§ã¯è²ããŸããã
2çªç®ã®éžæè¢ãæç€ºçã«åºåºåãè¿ãäŸã瀺ããŸãããã
class LimitedUseArray extends Array { static get [Symbol.species]() { return Array; // çµã¿èŸŒã¿ã¡ãœããã«ãã¬ãŒã³ãªArrayã€ã³ã¹ã¿ã³ã¹ãè¿ããã匷å¶ãã } constructor(...args) { super(...args); this.isLimited = true; // ã«ã¹ã¿ã ãããã㣠} checkLimits() { console.log(`ãã®é åã¯éå®çãªçšéã§ã: ${this.isLimited}`); } }
const limitedArr = new LimitedUseArray(10, 20, 30); limitedArr.checkLimits(); // ããã®é åã¯éå®çãªçšéã§ã: trueã const mappedLimitedArr = limitedArr.map(x => x * 2); console.log(mappedLimitedArr instanceof LimitedUseArray); // false console.log(mappedLimitedArr instanceof Array); // true // mappedLimitedArr.checkLimits(); // ãšã©ãŒïŒ mappedLimitedArr.checkLimitsã¯é¢æ°ã§ã¯ãªã console.log(mappedLimitedArr.isLimited); // undefined
ããã§ãmapã¡ãœããã¯æå³çã«éåžžã®Arrayãè¿ããæç€ºçãªã³ã³ã¹ãã©ã¯ã¿å¶åŸ¡ã瀺ããŠããŸãããã®ãã¿ãŒã³ã¯ãåŠçãã§ãŒã³ã®æ©ã段éã§æ¶è²»ããããã®åŸãç¹ã«é«åºŠã«æé©åãããã°ããŒãã«ããŒã¿ã»ã³ã¿ãŒã§ã®ããŒã¿ãããŒã®åŸæ®µã§ãããåºç¯ãªäºææ§ããªãŒããŒãããã®åæžã®ããã«æšæºçãªåã«åªé ã«æ»ããäžæçã§ãªãœãŒã¹å¹çã®è¯ãã©ãããŒã«åœ¹ç«ã€ãããããŸããã
Symbol.speciesãå°éããäž»èŠãªçµã¿èŸŒã¿ã¡ãœãã
Symbol.speciesã«ãã£ãŠã©ã®çµã¿èŸŒã¿ã¡ãœããã圱é¿ãåããããæ£ç¢ºã«çè§£ããããšãæãéèŠã§ãããã®åŒ·åãªã¡ã«ããºã ã¯ãæ°ãããªããžã§ã¯ããçæãããã¹ãŠã®ã¡ãœããã«æ®éçã«é©çšãããããã§ã¯ãªãããã®ãçš®å¥ããåæ ããæ°ããã€ã³ã¹ã¿ã³ã¹ãæ¬è³ªçã«äœæããæäœã®ããã«ç¹å¥ã«èšèšãããŠããŸãã
- Arrayã¡ãœãã: ãããã®ã¡ãœããã¯ãæ»ãå€ã®ã³ã³ã¹ãã©ã¯ã¿ã決å®ããããã«Symbol.speciesãå©çšããŸãã
- Array.prototype.concat()
- Array.prototype.filter()
- Array.prototype.map()
- Array.prototype.slice()
- Array.prototype.splice()
- Array.prototype.flat() (ES2019)
- Array.prototype.flatMap() (ES2019)
- TypedArrayã¡ãœãã: ç§åŠèšç®ãã°ã©ãã£ãã¯ã¹ã髿§èœããŒã¿åŠçã«äžå¯æ¬ ãªTypedArrayã®ã¡ãœããã§ãæ°ããã€ã³ã¹ã¿ã³ã¹ãäœæãããã®ã[Symbol.species]ãå°éããŸããããã«ã¯ã以äžã®ã¡ãœãããå«ãŸããŸãããããã«éå®ãããŸããã
- Float32Array.prototype.map()
- Int8Array.prototype.subarray()
- Uint16Array.prototype.filter()
- RegExpã¡ãœãã: é«åºŠãªãã®ã³ã°ãç¹å®ã®ãã¿ãŒã³æ€èšŒãªã©ã®æ©èœã远å ããå¯èœæ§ã®ããã«ã¹ã¿ã æ£èŠè¡šçŸã¯ã©ã¹ã«ãšã£ãŠããã¿ãŒã³ãããã³ã°ãå岿äœãè¡ãéã«åã®æŽåæ§ãç¶æããããã«Symbol.speciesã¯éèŠã§ãã
- RegExp.prototype.exec()
- RegExp.prototype[@@split]() (ããã¯String.prototype.splitãRegExpåŒæ°ã§åŒã³åºããããšãã«åŒã°ããå éšã¡ãœããã§ã)
- Promiseã¡ãœãã: éåæããã°ã©ãã³ã°ãå¶åŸ¡ãããŒãç¹ã«åæ£ã·ã¹ãã ã«ãããŠéåžžã«éèŠãªPromiseã¡ãœãããSymbol.speciesãå°éããŸãã
- Promise.prototype.then()
- Promise.prototype.catch()
- Promise.prototype.finally()
- Promise.all(), Promise.race(), Promise.any(), Promise.allSettled()ã®ãããªéçã¡ãœããïŒæŽŸçPromiseãããã§ãŒã³ããå ŽåããŸãã¯éçã¡ãœããåŒã³åºãäžã®thisã®å€ã掟çPromiseã³ã³ã¹ãã©ã¯ã¿ã§ããå ŽåïŒã
ãã®ãªã¹ãã培åºçã«çè§£ããããšã¯ãã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ããŸãã¯è€éãªã¢ããªã±ãŒã·ã§ã³ããžãã¯ãäœæããéçºè ã«ãšã£ãŠäžå¯æ¬ ã§ããã©ã®ã¡ãœãããããªãã®çš®å¥å®£èšãå°éããããæ£ç¢ºã«ç¥ãããšã§ãå ç¢ã§äºæž¬å¯èœãªAPIãèšèšã§ããããªãã®ã³ãŒãã倿§ãªããã°ãã°ã°ããŒãã«ã«åæ£ããéçºã»ãããã€ç°å¢ã«çµ±åãããéã®é©ããæžããããšãã§ããŸãã
é«åºŠãªãŠãŒã¹ã±ãŒã¹ãšéèŠãªèæ ®äºé
åã®ä¿æãšããåºæ¬çãªç®çãè¶ ããŠãSymbol.speciesã¯æŽç·Žãããã¢ãŒããã¯ãã£ãã¿ãŒã³ã®å¯èœæ§ãè§£ãæŸã¡ãæœåšçãªã»ãã¥ãªãã£ãžã®åœ±é¿ãããã©ãŒãã³ã¹ã®ãã¬ãŒããªããªã©ãããŸããŸãªæèã§æ éãªæ€èšãå¿ èŠãšããŸãã
ã©ã€ãã©ãªãšãã¬ãŒã ã¯ãŒã¯éçºã®åŒ·å
åºãæ¡çšãããŠããJavaScriptã©ã€ãã©ãªãå æ¬çãªãã¬ãŒã ã¯ãŒã¯ãéçºããäœè ã«ãšã£ãŠãSymbol.speciesã¯äžå¯æ¬ ãªã¢ãŒããã¯ãã£ã®åºæ¬èŠçŽ ã«ä»ãªããŸãããããã«ããããšã³ããŠãŒã¶ãŒãçµã¿èŸŒã¿æäœã®å®è¡äžã«ç¬èªã®ãç¹æ§ãã倱ãåºæã®ãªã¹ã¯ãªãã«ã·ãŒã ã¬ã¹ã«ãµãã¯ã©ã¹åã§ãããéåžžã«æ¡åŒµæ§ã®é«ãã³ã³ããŒãã³ãã®äœæãå¯èœã«ãªããŸããã«ã¹ã¿ã ã®Observableã·ãŒã±ã³ã¹ã¯ã©ã¹ãæã€ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ã©ã€ãã©ãªãæ§ç¯ããŠããã·ããªãªãèããŠã¿ãŠãã ããããŠãŒã¶ãŒãããªãã®åºæ¬Observableãæ¡åŒµããŠThrottledObservableãValidatedObservableãäœæããå Žåã圌ãã®filter()ãmap()ããŸãã¯merge()æäœããã©ã€ãã©ãªã®æ±çšçãªObservableã«æ»ãã®ã§ã¯ãªããäžè²«ããŠåœŒãã®ThrottledObservableïŒãŸãã¯ValidatedObservableïŒã®ã€ã³ã¹ã¿ã³ã¹ãè¿ãããšãåžžã«æãã§ããããããã«ããããŠãŒã¶ãŒã®ã«ã¹ã¿ã ã¡ãœãããããããã£ãããã³ç¹å®ã®ãªã¢ã¯ãã£ããªæ¯ãèããããããªãé£éãæäœã®ããã«å©çšå¯èœã§ããç¶ããæŽŸçããŒã¿ã¹ããªãŒã ã®æŽåæ§ãç¶æãããŸãã
ãã®èœåã¯ãç°ãªã倧éžã§æŽ»åããå ±æãšã³ã·ã¹ãã ã«è²¢ç®ããããŸããŸãªããŒã ã«ãã£ãŠéçºãããå¯èœæ§ã®ãããç°ãªãã¢ãžã¥ãŒã«ãã³ã³ããŒãã³ãéã®çžäºéçšæ§ãæ ¹æ¬çã«ä¿é²ããŸããSymbol.specieså¥çŽãèª å®ã«éµå®ããããšã§ãã©ã€ãã©ãªäœè ã¯éåžžã«å ç¢ã§æç€ºçãªæ¡åŒµãã€ã³ããæäŸããã©ã€ãã©ãªãããé©å¿æ§ãé«ããå°æ¥æ§ããããåçãªã°ããŒãã«ãœãããŠã§ã¢ã©ã³ãã¹ã±ãŒãå ã®é²åããèŠä»¶ã«å¯ŸããŠå埩åã®ãããã®ã«ããŸãã
ã»ãã¥ãªãã£ãžã®åœ±é¿ãšåæ··ä¹±ã®ãªã¹ã¯
Symbol.speciesã¯ãªããžã§ã¯ãæ§ç¯ã«å¯ŸããåäŸã®ãªãå¶åŸ¡ãæäŸããŸãããåæã«ã極ããŠæ éã«æ±ããªããã°ã誀çšãè匱æ§ã®ãã¯ãã«ãå°å ¥ããå¯èœæ§ããããŸãããã®ã·ã³ãã«ã¯*ä»»æã®*ã³ã³ã¹ãã©ã¯ã¿ã代æ¿ã§ãããããæªæã®ããæ»æè ã«ãã£ãŠæªçšãããããäžæ³šæãªéçºè ã«ãã£ãŠèª€ã£ãŠèšå®ããããããå¯èœæ§ãããã埮åŠãªãããæ·±å»ãªåé¡ã«ã€ãªããå¯èœæ§ããããŸãã
- åæ··ä¹±æ»æ: æªæã®ããè ã[Symbol.species]ã²ãã¿ãŒãäžæžãããŠã衚é¢çã«ã¯äºææ§ããããªããããæçµçã«ã¯äºæããªãããããã¯æµå¯Ÿçãªåã®ãªããžã§ã¯ããçæããã³ã³ã¹ãã©ã¯ã¿ãè¿ãå¯èœæ§ããããŸããåŸç¶ã®ã³ãŒããã¹ããªããžã§ã¯ãã®åã«ã€ããŠä»®å®ã眮ããŠããå ŽåïŒäŸïŒArrayãæåŸ ããŠããã®ã«ãããã·ãå éšã¹ãããã倿Žããããªããžã§ã¯ããåãåãïŒãããã¯åæ··ä¹±ãç¯å²å€ã¢ã¯ã»ã¹ããŸãã¯ãã®ä»ã®ã¡ã¢ãªç Žæã®è匱æ§ã«ã€ãªããå¯èœæ§ããããç¹ã«WebAssemblyããã€ãã£ãæ¡åŒµæ©èœãå©çšããç°å¢ã§ã¯å±éºã§ãã
- ããŒã¿æŒæŽ©/åå: ãããã·ãªããžã§ã¯ããè¿ãã³ã³ã¹ãã©ã¯ã¿ã«çœ®ãæããããšã§ãæ»æè ã¯ããŒã¿ãããŒãååãŸãã¯å€æŽããå¯èœæ§ããããŸããäŸãã°ãã«ã¹ã¿ã ã®SecureBufferã¯ã©ã¹ãSymbol.speciesã«äŸåããŠãããããããããã·ãè¿ãããã«äžæžããããå Žåãæ©å¯ããŒã¿ã®å€æãéçºè ã®ç¥ããªããã¡ã«ãã°ã«èšé²ãããã倿Žããããããå¯èœæ§ããããŸãã
- ãµãŒãã¹æåŠïŒDenial of ServiceïŒ: æå³çã«èª€èšå®ããã[Symbol.species]ã²ãã¿ãŒã¯ããšã©ãŒãã¹ããŒããããç¡éã«ãŒãã«å ¥ã£ãããéå°ãªãªãœãŒã¹ãæ¶è²»ããã³ã³ã¹ãã©ã¯ã¿ãè¿ãå¯èœæ§ããããã¢ããªã±ãŒã·ã§ã³ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹åã«åœ±é¿ãäžããä¿¡é Œã§ããªãå ¥åãåŠçããå Žåãã¢ããªã±ãŒã·ã§ã³ã®äžå®å®æ§ããµãŒãã¹æåŠã«ã€ãªããå¯èœæ§ããããŸãã
ã»ãã¥ãªãã£ã«ææãªç°å¢ãç¹ã«æ©å¯æ§ã®é«ãããŒã¿ããŠãŒã¶ãŒå®çŸ©ã®ã³ãŒãããŸãã¯ä¿¡é Œã§ããªããœãŒã¹ããã®å ¥åãåŠçããå ŽåãSymbol.speciesãä»ããŠäœæããããªããžã§ã¯ãã«å¯ŸããŠã峿 Œãªãµãã¿ã€ãºãæ€èšŒãããã³å³å¯ãªã¢ã¯ã»ã¹å¶åŸ¡ãå®è£ ããããšã絶察çã«äžå¯æ¬ ã§ããäŸãã°ãã¢ããªã±ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ããã©ã°ã€ã³ã«ã³ã¢ããŒã¿æ§é ã®æ¡åŒµãèš±å¯ããå Žåã[Symbol.species]ã²ãã¿ãŒãäºæããªããäºææ§ã®ãªãããŸãã¯æœåšçã«å±éºãªã³ã³ã¹ãã©ã¯ã¿ãæããŠããªãããšãä¿èšŒããããã«ãå ç¢ãªã©ã³ã¿ã€ã ãã§ãã¯ãå®è£ ããå¿ èŠããããããããŸãããã°ããŒãã«ãªéçºè ã³ãã¥ããã£ã¯ãŸããŸãå®å šãªã³ãŒãã£ã³ã°æ £è¡ã匷調ããŠããããã®åŒ·åã§åŸ®åŠãªæ©èœã¯ãã»ãã¥ãªãã£äžã®èæ ®äºé ã«å¯ŸããŠããé«ãã¬ãã«ã®æ³šæãèŠæ±ããŸãã
ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé ïŒãã©ã³ã¹ã®åããèŠç¹
Symbol.speciesã«ãã£ãŠå°å ¥ãããããã©ãŒãã³ã¹ã®ãªãŒããŒãããã¯ãçŸå®äžçã®ã¢ããªã±ãŒã·ã§ã³ã®å€§å€æ°ã«ãšã£ãŠäžè¬çã«ç¡èŠã§ããçšåºŠãšèŠãªãããŠããŸããJavaScriptãšã³ãžã³ã¯ãé¢é£ããçµã¿èŸŒã¿ã¡ãœãããåŒã³åºããããã³ã«ãã³ã³ã¹ãã©ã¯ã¿äžã®[Symbol.species]ããããã£ã®æ€çŽ¢ãå®è¡ããŸãããã®æ€çŽ¢æäœã¯ãéåžžãçŸä»£ã®JavaScriptãšã³ãžã³ïŒV8ãSpiderMonkeyãJavaScriptCoreãªã©ïŒã«ãã£ãŠé«åºŠã«æé©åãããŠãããéåžžã«å¹ççã«ããã°ãã°ãã€ã¯ãç§åäœã§å®è¡ãããŸãã
ã°ããŒãã«ããŒã ã«ãã£ãŠéçºãããWebã¢ããªã±ãŒã·ã§ã³ãããã¯ãšã³ããµãŒãã¹ãããã³ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®å§åç倿°ã«ãšã£ãŠãåã®æŽåæ§ãç¶æããã³ãŒãã®äºæž¬å¯èœæ§ãé«ããå ç¢ãªã¯ã©ã¹èšèšãå¯èœã«ãããšããæ·±ãå©çã¯ããããããã§ã»ãšãã©ç¥èŠã§ããªãããã©ãŒãã³ã¹ãžã®åœ±é¿ãã¯ããã«äžåããŸããä¿å®æ§ã®åäžããããã°æéã®ççž®ãããã³ã·ã¹ãã ä¿¡é Œæ§ã®åäžã«ããå©çã¯ãã¯ããã«å€§ãããã®ã§ãã
ããããè¶ é«é »åºŠååŒã¢ã«ãŽãªãºã ããã©ãŠã¶å ã§ã®ãªã¢ã«ã¿ã€ã ãªãŒãã£ãª/ãããªåŠçããŸãã¯CPUäºç®ãå³ããå¶çŽãããçµã¿èŸŒã¿ã·ã¹ãã ãªã©ã極ããŠããã©ãŒãã³ã¹ãéèŠã§äœé å»¶ã®ã·ããªãªã§ã¯ã1ãã€ã¯ãç§ããšãå®éã«éèŠã«ãªãããšããããŸãããããã®äŸå€çã«ããããªã±ãŒã¹ã§ãå³å¯ãªãããã¡ã€ãªã³ã°ã[Symbol.species]ã®æ€çŽ¢ãå³ããããã©ãŒãã³ã¹äºç®å ã§æž¬å®å¯èœã§èš±å®¹ã§ããªãããã«ããã¯ã«ãªã£ãŠããããšãæç¢ºã«ç€ºããå ŽåïŒäŸïŒ1ç§ãããæ°çŸäžã®é£éæäœïŒãé«åºŠã«æé©åãããä»£æ¿æ¡ãæ€èšãããããããŸããããããã«ã¯ãç¹å®ã®ã³ã³ã¹ãã©ã¯ã¿ãæåã§åŒã³åºããç¶æ¿ã®ä»£ããã«ã³ã³ããžã·ã§ã³ã䜿çšããããŸãã¯ã«ã¹ã¿ã ãã¡ã¯ããªé¢æ°ãå®è£ ããããšãå«ãŸããŸããããããç¹°ãè¿ããŸããã99%以äžã®ã°ããŒãã«ãªéçºãããžã§ã¯ãã«ãšã£ãŠãSymbol.speciesã«é¢ãããã®ã¬ãã«ã®ãã€ã¯ãæé©åãçŸå®çãªæžå¿µäºé ã«ãªãå¯èœæ§ã¯éåžžã«äœãã§ãã
Symbol.speciesãæå³çã«äœ¿çšããªãå Žå
ãã®åŠå®ã§ããªãåãšæçšæ§ã«ãããããããSymbol.speciesã¯ç¶æ¿ã«é¢é£ãããã¹ãŠã®èª²é¡ã«å¯Ÿããäžèœè¬ã§ã¯ãããŸãããæå³çã«ããã䜿çšããªãããšããŸãã¯æç€ºçã«åºåºã¯ã©ã¹ãè¿ãããã«èšå®ããããšãæãé©åãªèšèšå€æã§ãããå®å šã«æ£åœã§åŠ¥åœãªã·ããªãªããããŸãã
- åºåºã¯ã©ã¹ã®æ¯ãèãããŸãã«æ±ããããŠããå Žå: èšèšæå³ããæŽŸçã¯ã©ã¹ã®ã¡ãœãããæç€ºçã«åºåºã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãè¿ãããšã§ããå ŽåãSymbol.speciesãå®å šã«çç¥ããïŒããã©ã«ãã®æ¯ãèãã«äŸåããïŒããæç€ºçã«åºåºã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãè¿ãïŒäŸïŒreturn Array;ïŒã®ããæ£ããæãéææ§ã®é«ãã¢ãããŒãã§ããäŸãã°ããTransientArrayWrapperãã¯ãåæåŠçåŸã«ã©ãããŒãè±ãæšãŠãäžæµã®ã³ã³ã·ã¥ãŒãã®ããã«ã¡ã¢ãªãããããªã³ããåæžããããAPIãµãŒãã§ã¹ãåçŽåããããã«æšæºã®Arrayãè¿ãããã«èšèšããããããããŸããã
- æå°éãŸãã¯çŽç²ã«æ¯ãèãã«é¢ããæ¡åŒµã®å Žå: 掟çã¯ã©ã¹ããäž»ã«ã€ã³ã¹ã¿ã³ã¹ãçæããªãã¡ãœãããããã€ã远å ããã ãã®éåžžã«è»œéãªã©ãããŒã§ããå ŽåïŒäŸïŒErrorãæ¡åŒµããããå éšãšã©ãŒåŠçäžã«ãã®stackãmessageããããã£ãæ°ããã«ã¹ã¿ã ãšã©ãŒåã«åå²ãåœãŠãããããšãæåŸ ããªããã®ã³ã°ãŠãŒãã£ãªãã£ã¯ã©ã¹ïŒãSymbol.speciesã®è¿œå ã®ãã€ã©ãŒãã¬ãŒãã¯äžèŠãããããŸããã
- ç¶æ¿ããã³ã³ããžã·ã§ã³ã®ãã¿ãŒã³ãããé©ããŠããå Žå: ã«ã¹ã¿ã ã¯ã©ã¹ãåºåºã¯ã©ã¹ãšã®åŒ·åãªãis-aãé¢ä¿ãçã«è¡šããŠããªãå ŽåããŸãã¯è€æ°ã®ãœãŒã¹ããæ©èœãéçŽããŠããå Žåãã³ã³ããžã·ã§ã³ïŒãããªããžã§ã¯ããä»ã®ãªããžã§ã¯ããžã®åç §ãä¿æããïŒã¯ãç¶æ¿ãããæè»ã§ä¿å®æ§ã®é«ãèšèšéžæè¢ã§ããããšãå€ãã§ãããã®ãããªã³ã³ããžã·ã§ã³ã®ãã¿ãŒã³ã§ã¯ãSymbol.speciesã«ãã£ãŠå¶åŸ¡ããããçš®å¥ãã®æŠå¿µã¯éåžžé©çšãããŸããã
Symbol.speciesãæ¡çšããæ±ºå®ã¯ãåžžã«ãç¹ã«è€éãªã·ã¹ãã ã倿§ãªã°ããŒãã«ããŒã ã«ãã£ãŠæ¶è²»ãããå ±æã©ã€ãã©ãªã®æèã«ãããŠãçµã¿èŸŒã¿æäœäžã®æ£ç¢ºãªåä¿æã®æç¢ºãªå¿ èŠæ§ã«ãã£ãŠåæ©ä»ãããããæèçã§ããèããããã¢ãŒããã¯ãã£äžã®éžæã§ããã¹ãã§ããæçµçã«ã¯ãäžçäžã®éçºè ãšã·ã¹ãã ã®ããã«ãã³ãŒãã®æ¯ãèããæç€ºçã§ãäºæž¬å¯èœã§ãå埩åã®ãããã®ã«ããããšãéèŠã§ãã
ã°ããŒãã«ãªåœ±é¿ãšæ¥ç¶ãããäžçã®ããã®ãã¹ããã©ã¯ãã£ã¹
Symbol.speciesãææ ®æ·±ãå®è£ ããããšã®åœ±é¿ã¯ãåã ã®ã³ãŒããã¡ã€ã«ãããŒã«ã«éçºç°å¢ãã¯ããã«è¶ ããŠæ³¢åããŸãããããã¯ããŒã ã®ã³ã©ãã¬ãŒã·ã§ã³ãã©ã€ãã©ãªèšèšããããŠã°ããŒãã«ãªãœãããŠã§ã¢ãšã³ã·ã¹ãã å šäœã®å¥å šæ§ãšäºæž¬å¯èœæ§ã«æ·±ã圱é¿ãäžããŸãã
ä¿å®æ§ã®ä¿é²ãšå¯èªæ§ã®åäž
ã³ã³ããªãã¥ãŒã¿ãŒãè€æ°ã®å€§éžãæåçèæ¯ã«ãŸãããå¯èœæ§ã®ãã忣éçºããŒã ã«ãšã£ãŠãã³ãŒãã®æçããšææ§ãã®ãªãæå³ã¯æãéèŠã§ããã¯ã©ã¹ã®çš®å¥ã³ã³ã¹ãã©ã¯ã¿ãæç€ºçã«å®çŸ©ããããšã¯ãæåŸ ãããæ¯ãèããå³åº§ã«äŒããŸãããã«ãªã³ã®éçºè ããã³ã¬ããŒã«ã§æžãããã³ãŒããã¬ãã¥ãŒããéãCancellablePromiseã«then()ã¡ãœãããé©çšãããšãäžè²«ããŠå¥ã®CancellablePromiseãçæããããã®ç¬èªã®ãã£ã³ã»ã«æ©èœãä¿æãããããšãçŽæçã«çè§£ããã§ãããããã®éææ§ã¯ãèªç¥è² è·ãå€§å¹ ã«åæžããææ§ããæå°éã«æããéçºè ãæšæºã¡ãœããã«ãã£ãŠè¿ããããªããžã§ã¯ãã®æ£ç¢ºãªåãæšæž¬ããå¿ èŠããªããªãããããããã°äœæ¥ãå€§å¹ ã«å éãããããå¹ççã§ãšã©ãŒã®å°ãªãå調ç°å¢ãä¿é²ããŸãã
ã·ã¹ãã éã®ã·ãŒã ã¬ã¹ãªçžäºéçšæ§ã®ç¢ºä¿
仿¥ã®çžäºæ¥ç¶ãããäžçã§ã¯ããœãããŠã§ã¢ã·ã¹ãã ã¯ãŸããŸããªãŒãã³ãœãŒã¹ã³ã³ããŒãã³ããç¬èªã®ã©ã€ãã©ãªããããŠç¬ç«ããããŒã ã«ãã£ãŠéçºããããã€ã¯ããµãŒãã¹ã®ã¢ã¶ã€ã¯ã§æ§æãããŠãããã·ãŒã ã¬ã¹ãªçžäºéçšæ§ã¯è²ããªãèŠä»¶ã§ããSymbol.speciesãæ£ããå®è£ ããã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ã¯ãä»ã®éçºè ã«ãã£ãŠæ¡åŒµãããããããå€§èŠæš¡ã§è€éãªã·ã¹ãã ã«çµ±åããããããéã«ãäºæž¬å¯èœã§äžè²«ããæ¯ãèãã瀺ããŸãããã®å ±éã®å¥çŽãžã®æºæ ã¯ãã³ã³ããŒãã³ããäºæãã¬åã®äžäžèŽã«ééããããšãªã確å®ã«çžäºäœçšã§ãããããå¥å šã§å ç¢ãªãœãããŠã§ã¢ãšã³ã·ã¹ãã ãè²ã¿ãŸããããã¯ãå€åœç±çµç¹ã«ãã£ãŠæ§ç¯ããããšã³ã¿ãŒãã©ã€ãºã¬ãã«ã®ã¢ããªã±ãŒã·ã§ã³ã®å®å®æ§ãšã¹ã±ãŒã©ããªãã£ã«ãšã£ãŠéèŠãªèŠçŽ ã§ãã
æšæºåãšäºæž¬å¯èœãªæ¯ãèãã®ä¿é²
Symbol.speciesã®ãããªwell-knownã·ã³ãã«ã®æŠç¥çãªäœ¿çšãªã©ã確ç«ãããECMAScriptæšæºãžã®æºæ ã¯ãJavaScriptã³ãŒãå šäœã®äºæž¬å¯èœæ§ãšå ç¢æ§ã«çŽæ¥è²¢ç®ããŸããäžçäžã®éçºè ããããã®æšæºã¡ã«ããºã ã«ç¿çãããšã倿°ã®ãããžã§ã¯ããã³ã³ããã¹ããããã³çµç¹ã«ããã£ãŠèªä¿¡ãæã£ãŠç¥èãšãã¹ããã©ã¯ãã£ã¹ãé©çšã§ããŸãããã®æšæºåã¯ã忣ãããžã§ã¯ãã«åå ããæ°ããããŒã ã¡ã³ããŒã®åŠç¿æ²ç·ãå€§å¹ ã«ççž®ããé«åºŠãªèšèªæ©èœã®æ®éçãªçè§£ãè²ã¿ãããäžè²«æ§ã®ããé«å質ãªã³ãŒãã®åºåã«ã€ãªãããŸãã
å æ¬çãªããã¥ã¡ã³ããŒã·ã§ã³ã®éèŠãªåœ¹å²
ã¯ã©ã¹ã«Symbol.speciesãçµã¿èŸŒãå Žåããããç®ç«ã€ããã«åŸ¹åºçã«ææžåããããšã¯çµ¶å¯Ÿçãªãã¹ããã©ã¯ãã£ã¹ã§ããçµã¿èŸŒã¿ã¡ãœããã«ãã£ãŠã©ã®ã³ã³ã¹ãã©ã¯ã¿ãè¿ãããããæç¢ºã«è¿°ã¹ãéèŠãªããšãšããŠããã®èšèšéžæã®èåŸã«ããæ ¹æ ã説æããŠãã ãããããã¯ãã³ãŒãã倿§ãªåœéçãªéçºè ããŒã¹ã«ãã£ãŠæ¶è²»ãããæ¡åŒµãããã©ã€ãã©ãªäœè ã«ãšã£ãŠç¹ã«éèŠã§ããæç¢ºã§ç°¡æœããã€ã¢ã¯ã»ã¹ããããããã¥ã¡ã³ããŒã·ã§ã³ã¯ãæ°ãåããªãã»ã©ã®ãããã°ããã©ã¹ãã¬ãŒã·ã§ã³ãããã³èª€è§£ã®æéãæªç¶ã«é²ããã³ãŒãã®æå³ã®æ®éçãªç¿»èš³è ãšããŠæ©èœããŸãã
峿 Œã§èªååããããã¹ã
掟çã¯ã©ã¹ãçµã¿èŸŒã¿ã¡ãœãããšçžäºäœçšããéã®æ¯ãèããå ·äœçã«å¯Ÿè±¡ãšãããå æ¬çãªåäœãã¹ããšçµ±åãã¹ããèšè¿°ããããšãåžžã«åªå ããŠãã ãããããã«ã¯ãSymbol.speciesã®æç¡ïŒç°ãªãèšå®ããµããŒããŸãã¯æãŸããå ŽåïŒã®äž¡æ¹ã®ã·ããªãªã®ãã¹ããå«ããã¹ãã§ããè¿ããããªããžã§ã¯ããäžè²«ããŠæåŸ ãããåã§ãããå¿ èŠãªãã¹ãŠã®ã«ã¹ã¿ã ããããã£ãã¡ãœãããããã³æ¯ãèããä¿æããŠããããšã现å¿ã®æ³šæãæã£ãŠæ€èšŒããŠãã ãããå ç¢ãªèªåãã¹ããã¬ãŒã ã¯ãŒã¯ã¯ããã§äžå¯æ¬ ã§ãããå°ççãªèµ·æºã«é¢ä¿ãªãããã¹ãŠã®éçºç°å¢ãšè²¢ç®ã«ããã£ãŠã³ãŒãã®åè³ªãšæ£ç¢ºæ§ãä¿èšŒãããäžè²«æ§ã®ããåçŸå¯èœãªæ€èšŒã¡ã«ããºã ãæäŸããŸãã
ã°ããŒãã«éçºè ã®ããã®å®çšçãªæŽå¯ãšéèŠãªãã€ã³ã
JavaScriptãããžã§ã¯ãã§Symbol.speciesã®åã广çã«æŽ»çšããã°ããŒãã«ã«å ç¢ãªã³ãŒãããŒã¹ã«è²¢ç®ããããã«ã¯ããããã®å®çšçãªæŽå¯ãå¿ã«çããŠãã ããã
- åã®äžè²«æ§ãéèŠãã: çµã¿èŸŒã¿ã¯ã©ã¹ãæ¡åŒµãããã®çµã¿èŸŒã¿ã¡ãœãããå¿ å®ã«æŽŸçã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãè¿ãããšãæåŸ ããå Žåã¯ãSymbol.speciesãå©çšããããšãããã©ã«ãã®ç¿æ £ã«ããŠãã ãããããã¯ãã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£å šäœã§åŒ·åãªåã®äžè²«æ§ã確ä¿ããããã®åºç€ã§ãã
- 圱é¿ãåããã¡ãœããããã¹ã¿ãŒãã: ããŸããŸãªãã€ãã£ãåã«ããã£ãŠSymbol.speciesãç©æ¥µçã«å°éãå©çšããçµã¿èŸŒã¿ã¡ãœããïŒäŸïŒArray.prototype.map, Promise.prototype.then, RegExp.prototype.execïŒã®ç¹å®ã®ãªã¹ãã«ç²Ÿéããããã®æéãæè³ããŠãã ããã
- æ éãªã³ã³ã¹ãã©ã¯ã¿éžæãå®è·µãã: [Symbol.species]ã²ãã¿ãŒããthisãè¿ãããšãæãäžè¬çã§ãã°ãã°æ£ããéžæã§ãããé«åºŠã§å°éçãªèšèšèŠä»¶ã®ããã«æå³çã«åºåºã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãå šãç°ãªãã³ã³ã¹ãã©ã¯ã¿ãè¿ãããšã®æå³ãšç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã培åºçã«çè§£ããŠãã ããã
- ã©ã€ãã©ãªã®å ç¢æ§ãé«ãã: ã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ãæ§ç¯ããéçºè ã«ãšã£ãŠãSymbol.speciesã¯ãå ç¢ã§éåžžã«æ¡åŒµæ§ãé«ãã ãã§ãªããã°ããŒãã«ãªéçºè ã³ãã¥ããã£ã«ãšã£ãŠäºæž¬å¯èœã§ä¿¡é Œæ§ã®é«ãã³ã³ããŒãã³ããæäŸããããã®éèŠã§é«åºŠãªããŒã«ã§ããããšãèªèããŠãã ããã
- ããã¥ã¡ã³ããŒã·ã§ã³ãšå³æ Œãªãã¹ããåªå ãã: ã«ã¹ã¿ã ã¯ã©ã¹ã®çš®å¥ã®æ¯ãèãã«é¢ããéåžžã«æç¢ºãªããã¥ã¡ã³ããŒã·ã§ã³ãåžžã«æäŸããŠãã ãããéèŠãªããšãšããŠããããå æ¬çãªåäœãã¹ããšçµ±åãã¹ãã§è£ä»ããçµã¿èŸŒã¿ã¡ãœããã«ãã£ãŠè¿ããããªããžã§ã¯ããäžè²«ããŠæ£ããåã§ãããæåŸ ããããã¹ãŠã®æ©èœãä¿æããŠããããšãæ€èšŒããŠãã ããã
Symbol.speciesãæ¥ã ã®éçºããŒã«ãããã«ææ ®æ·±ãçµ±åããããšã§ãJavaScriptã¢ããªã±ãŒã·ã§ã³ã«æ¯é¡ã®ãªãå¶åŸ¡ãåäžããäºæž¬å¯èœæ§ãããã³åªããä¿å®æ§ãæ ¹æ¬çã«äžããããšãã§ããŸããããã¯ãã²ããŠã¯ããã¹ãŠã®å°ççãªå¢çãè¶ããŠã·ãŒã ã¬ã¹ã«äœæ¥ããããŒã ã«ãšã£ãŠãããååçã§ãå¹ççã§ãä¿¡é Œæ§ã®é«ãéçºäœéšãä¿é²ããŸãã
çµè«ïŒJavaScriptã®Speciesã·ã³ãã«ã®æ°žç¶çãªéèŠæ§
Symbol.speciesã¯ãçŸä»£ã®JavaScriptã®æŽç·ŽåºŠãæ·±ãããããŠåºæã®æè»æ§ã®æ·±é ãªèšŒãšããŠååšããŸããããã¯éçºè ã«ãçµã¿èŸŒã¿ã¡ãœãããæŽŸçã¯ã©ã¹ããæ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããéã«æ¡çšããæ£ç¢ºãªã³ã³ã¹ãã©ã¯ã¿é¢æ°ãå¶åŸ¡ããããã®ãæ£ç¢ºã§ãæç€ºçã§ã匷åãªã¡ã«ããºã ãæäŸããŸãããã®æ©èœã¯ããªããžã§ã¯ãæåããã°ã©ãã³ã°ã«åºæã®ããã°ãã°åŸ®åŠãªéèŠãªèª²é¡ã«å¯ŸåŠããŸããããã¯ã掟çåãããŸããŸãªæäœãéããŠäžè²«ããŠãã®ãçš®å¥ããç¶æããããã«ãã£ãŠã«ã¹ã¿ã æ©èœãä¿æãã匷åãªåã®æŽåæ§ã確ä¿ããäºæããªãæ¯ãèãã®éžè±ãé²ãããšã§ãã
åœéçãªéçºããŒã ãã°ããŒãã«ã«åæ£ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã¢ãŒããã¯ãããããŠåºãæ¶è²»ãããã©ã€ãã©ãªã®äœè ã«ãšã£ãŠãSymbol.speciesã«ãã£ãŠæäŸãããäºæž¬å¯èœæ§ãäžè²«æ§ãããã³æç€ºçãªå¶åŸ¡ã¯ãåã«è²Žéãªãã®ã§ããããã¯è€éãªç¶æ¿éå±€ã®ç®¡çãåçã«ç°¡çŽ åããçºèŠãå°é£ãªåé¢é£ã®ãã°ã®ãªã¹ã¯ãå€§å¹ ã«åæžããæçµçã«ã¯å°ççããã³çµç¹çãªå¢çãè¶ããå€§èŠæš¡ãªã³ãŒãããŒã¹ã®å šäœçãªä¿å®æ§ãæ¡åŒµæ§ãããã³çžäºéçšæ§ãåäžãããŸãããã®åŒ·åãªECMAScriptæ©èœãææ ®æ·±ãåãå ¥ããçµ±åããããšã§ãããªãã¯åã«ããå ç¢ã§å埩åã®ããJavaScriptãæžããŠããã ãã§ã¯ãããŸãããããªãã¯ãã©ãã«ããŠãããã¹ãŠã®äººã«ãšã£ãŠãããäºæž¬å¯èœã§ãååçã§ãã°ããŒãã«ã«èª¿åã®ãšãããœãããŠã§ã¢éçºãšã³ã·ã¹ãã ã®æ§ç¯ã«ç©æ¥µçã«è²¢ç®ããŠããã®ã§ãã
çŸåšãŸãã¯æ¬¡ã®ãããžã§ã¯ãã§Symbol.speciesã詊ããŠã¿ãããšãå¿ãããå§ãããŸãããã®ã·ã³ãã«ãããªãã®ã¯ã©ã¹èšèšãã©ã®ããã«å€é©ããããã«æŽç·Žãããä¿¡é Œæ§ãé«ããã°ããŒãã«ã«å¯Ÿå¿ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããåãäžããããçŽæ¥èгå¯ããŠãã ãããããªãã®ã¿ã€ã ãŸãŒã³ãå Žæã«é¢ä¿ãªããããããŒã³ãŒãã£ã³ã°ïŒ