हालांकि मुझे कोई भी दस्तावेज नहीं मिला है, जिसमें एक बच्चे या कक्षा द्वारा ओवरराइड की गई स्थिर विधि का जिक्र करने के बारे में कोई तरीका नहीं है, इसलिए सवाल यह है कि क्या मैं हमेशा इस पर भरोसा कर सकता हूं?
यह मानक फ़ंक्शन-कॉल-थ्रू-ऑब्जेक्ट-प्रॉपर्टी तंत्र है। जब आप ऐसा करेंगे:
Child1.doImportantStuff();
... जब तक doImportantStuff
एक तीर समारोह (यह नहीं है) या एक बाध्य समारोह (यह नहीं है) है, तो कॉल के दौरान, this
Child1
को तैयार है। बिल्कुल इस तरह:
var obj = {
foo: function() {
console.log(this === obj);
}
};
obj.foo(); // "true"
तो हाँ, आप उस पर भरोसा कर सकते हैं। (और मैं समझता हूँ कि तुम क्यों पूछा, यह थोड़ा अजीब जब तक आप इसे माध्यम से काम प्रतीत होता है।)
बेशक
, यह एक गैर static
समारोह के कोड के भीतर से काम नहीं करेगा, क्योंकि this
संदर्भित करेंगे उदाहरण के लिए, कन्स्ट्रक्टर समारोह नहीं। यदि आपको वहां इसकी आवश्यकता है, तो आप this.constructor.doImportantStuff
का उपयोग कर सकते हैं जब तक कि किसी ने constructor
संपत्ति को गड़बड़ नहीं किया हो। (लोग हमेशा गड़बड़ यह अप करने के लिए इस्तेमाल किया;, यह स्वचालित नई वाक्य रचना के साथ उम्मीद है कि कम नहीं होगा, हालांकि यह दुर्लभ तुम सच में इसकी जरूरत है ...)
सवालों के इन प्रकार के लिए, यह याद रखना महत्वपूर्ण अक्सर उपयोगी है कि नया वर्ग वाक्यविन्यास लगभग पुराने वर्बोज़ तरीके के लिए सिंटैक्टिक चीनी है जो हमने किया (अगर हम वास्तव में पूरी तरह से थे)। यह वास्तव में अच्छा चीनी है, लेकिन यह लगभग सभी है (और यह एक अच्छा बात ™ है)। static
विधियों को कन्स्ट्रक्टर फ़ंक्शन के गुणों के रूप में सेट किया गया है, गैर-static
विधियों को कन्स्ट्रक्टर की prototype
संपत्ति पर ऑब्जेक्ट के गुणों के रूप में सेट किया गया है। (मुझे लगता है कि इसका एकमात्र गैर-चीनी पहलू है, Bergi बताता है कि नया वाक्यविन्यास हमें Array
जैसे बिल्टिन का विस्तार करने देता है, जो पहले करना संभव नहीं था। संभव बनाने का एक हिस्सा यह बताता है कि this
कैसे मिलता है सेट अप करें [super()
से पहले इसे अपने सबक्लास कंस्ट्रक्टर में कॉल नहीं कर सकते], जो new.target
से संबंधित है, जो बर्गि discusses here है। ईएस 7 में, यह गोपनीयता सामग्री के साथ चीनी से आगे जा सकता है।)
स्रोत
2015-09-09 16:54:03
'इन'' में संदर्भित 'यह' केवल फ़ंक्शन कहलाता है इस पर निर्भर करता है। यदि आप इसे 'Parent.init()' के साथ कहते हैं तो यह 'माता-पिता' को संदर्भित करता है। यदि आप इसे 'Child1.init()' के साथ कहते हैं तो यह 'Child1' को संदर्भित करता है। इसका ईएस 6 के साथ कुछ लेना देना नहीं है, इस प्रकार जावास्क्रिप्ट हमेशा काम करता है (और ES6 उसमें बदलाव नहीं करता है)। –
"विस्तारित खंड" में विस्तार करने के बारे में कुछ है: http://www.2ality.com/2015/02/es6-classes-final.html –
[ईएस 6 - कक्षा के भीतर कॉल स्थैतिक विधि] के संभावित डुप्लिकेट (http://stackoverflow.com/q/31116300/1048572) – Bergi