EDIT फरवरी 2012: नीचे दिया गया उत्तर अब सटीक नहीं है। __proto__ को "मानक वैकल्पिक" के रूप में ECMAScript 6 में जोड़ा जा रहा है, जिसका अर्थ है कि इसे लागू करने की आवश्यकता नहीं है, लेकिन यदि यह है, तो इसे नियमों के दिए गए सेट का पालन करना चाहिए। यह वर्तमान में अनसुलझा है लेकिन कम से कम यह आधिकारिक तौर पर जावास्क्रिप्ट के विनिर्देश का हिस्सा होगा।
यह सवाल सतह पर लगता है की तुलना में बहुत अधिक जटिल है, और सबसे अधिक लोगों के वेतन ग्रेड से परे जावस के आंतरिक के ज्ञान के संबंध में है।
prototype
किसी वस्तु की संपत्ति का उपयोग उस वस्तु की नई बाल वस्तुओं को बनाते समय किया जाता है। इसे बदलना वस्तु में स्वयं को प्रतिबिंबित नहीं करता है, बल्कि प्रतिबिंबित होता है जब उस वस्तु का उपयोग अन्य वस्तुओं के लिए एक निर्माता के रूप में किया जाता है, और किसी मौजूदा वस्तु के प्रोटोटाइप को बदलने में इसका कोई उपयोग नहीं होता है।
function myFactory(){};
myFactory.prototype = someOtherObject;
var newChild = new myFactory;
newChild.__proto__ === myFactory.prototype === someOtherObject; //true
वस्तुओं में एक आंतरिक [[प्रोटोटाइप]] संपत्ति होती है जो वर्तमान प्रोटोटाइप की ओर इशारा करती है। जिस तरह से यह काम करता है जब भी किसी वस्तु पर एक संपत्ति कहा जाता है तो यह ऑब्जेक्ट पर शुरू होगा और फिर रूट ऑब्जेक्ट प्रोटोटाइप के बाद [[प्रोटोटाइप]] श्रृंखला के माध्यम से मेल खाता है, या असफल होने तक ऊपर जाएगा। इस तरह से जावास्क्रिप्ट रनटाइम बिल्डिंग और ऑब्जेक्ट्स के संशोधन के लिए अनुमति देता है; इसकी एक योजना है जिसे इसकी आवश्यकता है।
__proto__
संपत्ति (अब एक बहुत) कुछ कार्यान्वयन में मौजूद है: किसी भी मोज़िला कार्यान्वयन, सभी वेबकिट लोगों मैं के बारे में पता है, कुछ अन्य शामिल हैं। यह संपत्ति आंतरिक [[प्रोटोटाइप]] संपत्ति की ओर इशारा करती है और वस्तुओं पर संशोधन के बाद निर्माण की अनुमति देती है। कोई भी गुण और फ़ंक्शन इस जंजीर लुक के कारण प्रोटोटाइप से मेल खाने के लिए तुरंत स्विच हो जाएंगे।
यह सुविधा, जबकि अब मानकीकृत की जा रही है, अभी भी जावास्क्रिप्ट का एक आवश्यक हिस्सा नहीं है, और इसका समर्थन करने वाली भाषाओं में आपके कोड को "अडॉप्टिमाइज्ड" श्रेणी में नीचे दस्तक देने की उच्च संभावना है। जेएस इंजनों को कोड को वर्गीकृत करने के लिए अपना सर्वश्रेष्ठ करना पड़ता है, विशेष रूप से "हॉट" कोड जो बहुत बार एक्सेस किया जाता है, और यदि आप कुछ फैंसी जैसे संशोधन कर रहे हैं __proto__
, तो वे आपके कोड को बिल्कुल भी ऑप्टिमाइज़ नहीं करेंगे।
यह पोस्ट https://bugzilla.mozilla.org/show_bug.cgi?id=607863 विशेष रूप से वर्तमान कार्यान्वयन __proto__
और उनके बीच के अंतरों पर चर्चा करती है। हर कार्यान्वयन इसे अलग तरीके से करता है, क्योंकि यह एक कठिन और अनसुलझी समस्या है। जावास्क्रिप्ट में सब कुछ परस्पर भिन्न है, सिवाय एक।) सिंटैक्स b।) होस्ट ऑब्जेक्ट (तकनीकी रूप से जावास्क्रिप्ट के बाहर डोम मौजूद है) और सी।) __proto__
। बाकी पूरी तरह से आप और हर दूसरे डेवलपर के हाथों में है, इसलिए आप देख सकते हैं कि क्यों __proto__
एक गले में अंगूठे की तरह चिपक जाती है।
एक चीज है __proto__
जो इसके लिए अनुमति देती है अन्यथा करना असंभव है: रनवे पर एक ऑब्जेक्ट प्रोटोटाइप का पदनाम इसके निर्माता से अलग होता है। यह एक महत्वपूर्ण उपयोग मामला है और प्राथमिक कारणों __proto__
में से एक पहले से ही मृत नहीं है। यह पर्याप्त महत्वपूर्ण है कि यह सद्भाव के निर्माण में एक गंभीर चर्चा बिंदु है, या जल्द ही ECMAScript 6 के रूप में जाना जाता है। निर्माण के दौरान किसी वस्तु के प्रोटोटाइप को निर्दिष्ट करने की क्षमता जावास्क्रिप्ट के अगले संस्करण का एक हिस्सा होगा और यह होगा घंटी के संकेत __proto__
के दिन औपचारिक रूप से गिने जाते हैं।
अल्पावधि में, __proto__
यदि आप उन ब्राउज़रों को लक्षित कर रहे हैं, जो इसका समर्थन करते हैं (IE नहीं, तो कभी IE नहीं)। यह संभावना है कि यह अगले 10 वर्षों के लिए webkit और moz में काम करेगा क्योंकि ES6 को 2013 तक अंतिम रूप नहीं दिया जाएगा।
ब्रेंडन ईच - re: ES5 में नई वस्तु विधियों का दृष्टिकोण :
क्षमा करें, ... लेकिन __proto__
ऑब्जेक्ट इनिलाइज़र उपयोग के मामले से अलग (निपटाने योग्य, एक नई वस्तु पर, जो अभी तक उपलब्ध नहीं है, ES5 के Object.create के अनुरूप है), एक भयानक विचार है। मैं यह लिखता हूं __proto__
कि 12 साल पहले इसे डिजाइन और कार्यान्वित किया गया था।
... स्तरीकरण की कमी एक समस्या है (एक कुंजी के साथ JSON डेटा पर विचार करें "__proto__"
)। और इससे भी बदतर, उत्परिवर्तन का मतलब है कि कार्यान्वयन को साइकल के प्रोटोटाइप चेन के लिए जांचना चाहिए ताकि ilooping से बचने के लिए। [अनंत पुनरावृत्ति के लिए निरंतर जांच आवश्यक है]
अंत में, __proto__
किसी मौजूदा ऑब्जेक्ट पर उत्परिवर्तन नए प्रोटोटाइप ऑब्जेक्ट में गैर-सामान्य तरीकों को तोड़ सकता है, जो संभवतः रिसीवर (प्रत्यक्ष) ऑब्जेक्ट पर काम नहीं कर सकता __proto__
है जिसे सेट किया जा रहा है। यह केवल बुरा अभ्यास है, सामान्य रूप में जानबूझकर प्रकार भ्रम का एक रूप है।