2016-05-22 11 views
5

मैं पढ़ रहा हूं कि आप जेएस नहीं जानते: ES6 & परे और मुझे Symbol.species अनुभाग में इस स्निपेट का सामना करना पड़ा।इस स्निपेट में यह क्या करता है?

class Cool { 
 
    // defer `@@species` to derived constructor 
 
    static get [Symbol.species]() { return this; } 
 

 
    again() { 
 
     return new this.constructor[Symbol.species](); 
 
    } 
 
} 
 

 
class Fun extends Cool {} 
 

 
class Awesome extends Cool { 
 
    // force `@@species` to be parent constructor 
 
    static get [Symbol.species]() { return Cool; } 
 
} 
 

 
var a = new Fun(), 
 
    b = new Awesome(), 
 
    c = a.again(), 
 
    d = b.again(); 
 

 
c instanceof Fun;   // true 
 
d instanceof Awesome;  // false 
 
d instanceof Cool;   // true

यह समारोह Symbol.species की तरह लगता है {लौट कुछ} हमेशा एक निर्माता समारोह लौटना चाहिए। लेकिन इस फ़ंक्शन की पहली उपस्थिति में: static get [Symbol.species]() { return this; } मैं उलझन में हूं क्योंकि मुझे हमेशा लगता है कि यह एक कन्स्ट्रक्टर फ़ंक्शन के बजाय ऑब्जेक्ट होना चाहिए। क्या आप तथ्यों को स्पष्ट करने में मेरी मदद कर सकते हैं?

और लगभग return new this.constructor[Symbol.species]();, यह यहां क्या संदर्भित करता है?

उत्तर

5

this इसे निष्पादित किए गए संदर्भ के आधार पर किसी विधि के अंदर कुछ अलग संदर्भित करेगा।

कक्षा विधियों में, स्थिर तरीके, this कक्षा का संदर्भ लेंगे।

static get [Symbol.species]() { return this; } 

इस के बाद से साथ उदाहरण के लिए

तो एक वर्ग विधि है, यह वर्ग पर निष्पादित किया जाता है जाएगा जाता है और this वर्ग के लिए की तरह, उदाहरण के तरीकों के लिए

//since this is a getter we don't use trailing `()` 
Cool[Symbol.species] === Cool; 
//It does not exist on instances 
var myCool = new Cool(); 
console.log(myCool[Symbol.species]); 
//will give undefined 

अब संदर्भित करेंगे again विधि, वे केवल उदाहरण पर मौजूद हैं और इसलिए उदाहरण से कहा जाता है और कक्षा नहीं:

console.log(Cool.again); 
//will give undefined 
var myCool = new Cool(); 
var newInstance = myCool.again(); 

उदाहरण के तरीके this उदाहरण को संदर्भित करता है, कक्षा नहीं।

तो दिया:

return new this.constructor[Symbol.species](); 
  • this उदाहरण है (जैसे, new Cool)
  • this.constructor निर्माता कि उदाहरण बनाया है (जैसे, Cool)
  • this.constructor[Symbol.species] वर्ग गेटर विधि है Symbol.species
  • new this.constructor[Symbol.species]() का एक नया उदाहरण है वर्ग कि Symbol.species लौटे

तो पूरी लाइन एक वर्ग है कि स्थिर गेटर Symbol.species विधि रिटर्न का एक नया उदाहरण लौटा रहा है।

यह कक्षा को ऐसे तरीकों की अनुमति देता है जो बिना किसी नाम के कक्षा के नए उदाहरण बनाते हैं।

तो जैसा कि उदाहरण से पता चलता है, भले ही Fun परिभाषित कभी नहीं अपने आप again विधि againFun का एक नया उदाहरण बनाने के लिए कैसे जानता है। और Awesome दिखाता है कि आप कौन सा उदाहरण again बनाएंगे, यह बदलने के लिए सिंबल.species को ओवरराइड कर सकते हैं।

संबंधित मुद्दे