2010-11-01 15 views
6

मुझे पता है कि prototype जावास्क्रिप्ट फ़ंक्शन ऑब्जेक्ट्स की प्रॉपर्टी को कन्स्ट्रक्टर के रूप में फ़ंक्शन का उपयोग करके तत्काल ऑब्जेक्ट्स की आंतरिक [[Prototype]] प्रॉपर्टी (ए.के.ए. __proto__) पर कॉपी किया गया है।जावास्क्रिप्ट फ़ंक्शन की प्रोटोटाइप प्रॉपर्टी का प्रारंभिक मान क्या है?

function Foo() {} 
Foo.prototype = { 
    toString: function() { return "I'm a Foo!"; } 
} 
new Foo().toString() 
// --> "I'm a Foo!" 

ऐसा लगता है कि यह काम करता है कि के लिए कक्षा तरीकों मौजूदा नव की प्रोटोटाइप के रूप में कार्य करना चाहिए जोड़ने के लिए बड़े पैमाने पर अभ्यास है: तो, मैं किसी भी वस्तु को यह संपत्ति है कि मैं प्रोटोटाइप के रूप में कार्य करना चाहते हैं निर्धारित कर सकते हैं इस तरह उत्पन्न कार्य:

function Bar() {} 
Bar.prototype.toString = function() { 
    return "I'm a Bar!"; 
} 
new Bar().toString() 
// --> "I'm a Bar!" 

यह मेरे लिए स्पष्ट नहीं है, हालांकि है, क्या prototype संपत्ति के प्रारंभिक मूल्य है।

function Baz() {} 
Baz.prototype 
// --> Baz { 
//  constructor: function Baz() {}, 
//  __proto__: Object 
//  } 

टिप्पणी दिखाती है कि क्रोम का जावास्क्रिप्ट कंसोल प्रिंट करता है। क्या इसका मतलब यह है कि मैं जो भी काम करता हूं वह वास्तव में दो ऑब्जेक्ट बनाता है? एक समारोह के लिए स्वयं (constructor) और एक प्रोटोटाइप के लिए?

क्या यह ईसीएमएस्क्रिप्ट मानक में कहीं परिभाषित है? मैंने इसे खोजने की कोशिश की लेकिन नहीं कर सका। क्या सभी ब्राउज़र इस तरह से संभालते हैं?

उत्तर

10

prototype किसी भी नव निर्मित Function उदाहरण पर का प्रारंभिक मूल्य Object का एक नया उदाहरण है, लेकिन खुद-संपत्ति constructor सेट के साथ वापस नए कार्य को करने के लिए बात करने के लिए।

यह खंड 13.2 में ECMA262-5 द्वारा ठेठ ECMAScript-विशिष्ट जानकारी पूरी तरह से अपठनीय फैशन में वर्णित है:

(16.) चलो आद्य एक नई वस्तु बनाने का नतीजा हो के रूप में निर्माण किया जाएगा अभिव्यक्ति new Object() जहां Object मानक में निर्मित निर्माता कि नाम

(17.) [[DefineOwnProperty]] तर्कों के साथ "निर्माता" आद्य के आंतरिक पद्धति को कॉल के साथ है, संपत्ति डिस्क्रिप्टर द्वारा {[[मूल्य]]: एफ, {[[लिखने योग्य]]: सत्य, [[गणना]]: झूठी, [[कॉन्फ़िगर करने योग्य]]: सत्य}, और झूठी।

(18.) तर्क [प्रोटोटाइप ", संपत्ति वर्णनकर्ता {[[मूल्य]]: proto, {[[लिखने योग्य]] के साथ [[DefineOwnProperty]] आंतरिक विधि को कॉल करें [{[लिखने योग्य]]: सत्य, [[गणना योग्य]] : झूठी, [[कॉन्फ़िगर करने योग्य]]: झूठी}, और झूठी।

+0

धन्यवाद। यही वह जवाब था जिसे मैं ढूंढ रहा था। – MForster

+1

ओएमजी! मैं अब और फिर ईसीएमएस्क्रिप्ट विनिर्देश में कूदता हूं, लेकिन यह शायद ही पठनीय है। क्या आप एक ऐसे संसाधन को जानते हैं जो चरण-दर-चरण में सब कुछ बताता है (या कम से कम उन भयानक भागों को समझाता है)? –

+2

दुख की बात नहीं। यह शर्म की बात है कि ईसीएमएस्क्रिप्ट के लिए वास्तविक अंग्रेजी में एक भाषा के रूप में कोई अच्छा संदर्भ नहीं है, विशेष रूप से इसकी कई विशेषताएं हैं ... उदार होने के लिए ... थोड़ा विचित्र। हमारे पास एमडीसी, एमएसडीएन और एडोब जैसे विक्रेता-विशिष्ट मार्गदर्शिकाएं हैं, हमें निकट-उपयोग करने योग्य ईसीएमए स्पेक मिला है (आप उपर्युक्त भाषा में उपयोग करते हैं, लेकिन यह अभी भी वास्तव में सबसे अच्छा समय पर चल रहा है), और इसके अलावा यादृच्छिक ट्यूटोरियल साइटों का गटर है जो त्रुटियों और भयानक सलाह से भरे हुए हैं। और यह, दुनिया में सबसे व्यापक रूप से उपयोग की जाने वाली भाषाओं में से एक के लिए। यह निराशाजनक है। – bobince

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