2011-10-07 18 views
20

फ़ंक्शन का __proto__ क्या है?

मैं यह अच्छा चित्र देखें और मैं अपने क्रोम ब्राउज़र में कुछ परीक्षण किया है, लेकिन मैं नहीं जानता कि यह कैसे व्याख्या करने के लिए:

> Function.prototype 
    function Empty() {} 
> Function.__proto__ 
    function Empty() {} 
> typeof(Empty) 
    "undefined" 

function Empty() {} क्या है, और क्यों Function.prototypefunctionobject नहीं है जैसे Object.prototype?

उपरोक्त आरेख से, ऐसा लगता है कि जावास्क्रिप्ट में सब कुछ Object.prototype से शुरू होता है, क्या मैं इसके बारे में सही हूं?

+0

इस पहेली का उत्तर यह है कि फ़ंक्शन .__ proto __.__ proto__ === ऑब्जेक्ट.प्रोटोटाइप। लेकिन आप Function.constructor.prototype के माध्यम से वहां नहीं पहुंचेंगे, क्योंकि यह अपरिभाषित (या बिल्कुल सेट नहीं) पर सेट किया गया था। – Stefan

+0

+1 मैं हमेशा कुछ समझाने का सबसे सरल तरीका सोचता हूं कि चित्र/आरेख खींचना और बात करना है। आरेख को जोड़ने के लिए धन्यवाद! –

उत्तर

17

सबसे पहले, function Empty() {} प्रतिनिधित्व V8 सामान है।

वी 8 में, Function.prototype वस्तु Function.prototype.name संपत्ति के मूल्य के रूप में "Empty है ", तो मैं आप शायद क्रोम के डेवलपर कंसोल का उपयोग कर रहे लगता है, और यह इस तरह से फ़ंक्शन का नाम प्रदर्शित करता है।

समारोह वस्तुओं की name संपत्ति, non-standard (ECMA-262 का हिस्सा नहीं है) इसलिए हम कार्यान्वयन के बीच मतभेदों को देखते हैं।

अब, Function.prototype एक समारोह, कि हमेशा undefined वापस आती है और तर्क के किसी भी संख्या को स्वीकार कर सकते, लेकिन क्यों है? शायद बस स्थिरता के लिए, प्रत्येक अंतर्निर्मित construc टो के प्रोटोटाइप, उस तरह है Number.prototype एक Number वस्तु, Array.prototype एक Array वस्तु है, RegExp.prototype एक RegExp वस्तु है, और इतने पर ...

फर्क सिर्फ इतना है (उदाहरण के लिए, किसी भी समारोह वस्तु Function.prototype के बीच और) वह यह है कि स्पष्ट रूप से Function.prototypeObject.prototype से विरासत प्राप्त करता है।

ऐसा लगता है कि जावास्क्रिप्ट में ऑब्जेक्ट.प्रोटोटाइप से शुरू होता है, क्या मैं इसके बारे में सही हूं?

ठीक है, तुम सही Object.prototype सबसे वस्तुओं के प्रोटोटाइप श्रृंखला के अंतिम वस्तु है, लेकिन ECMAScript 5 में, तुम भी वस्तुओं है कि कुछ भी (Object.prototype बस की तरह है) से विरासत नहीं है बना सकते हैं कर रहे हैं, और एक और विरासत श्रृंखला के रूप में, उदाहरण के लिए:

var parent = Object.create(null), 
    child = Object.create(parent); 

Object.prototype.isPrototypeOf(parent); // false 

Object.getPrototypeOf(parent);   // null 
Object.getPrototypeOf(Object.prototype); // null 
+0

असल में मैं अभी भी जानना चाहता हूं कि क्यों कंसोल आमतौर पर फंक्शन.प्रोटोटाइप को फंक्शन और अन्य सभी प्रकार RegExp, स्ट्रिंग, ऑब्जेक्ट के रूप में टाइप करता है। मुझे पता है कि आपने इसका उल्लेख किया है लेकिन स्थिरता के लिए ?? कृपया इस पर कुछ और प्रकाश डालें – Gurjit

6

सीएमएस उत्कृष्ट जवाब एकीकृत करने के लिए:

यह Object.prototype से जावास्क्रिप्ट शुरुआत में सब कुछ लगता है, मैं सही है कि के बारे में कर रहा हूँ?

बिल्कुल, जावास्क्रिप्ट में ऑब्जेक्ट्स मूल ऑब्जेक्ट तक सीमित हैं। विरासत की श्रृंखला रनटाइम पर काम करती है, इसलिए यदि मूल वस्तु संशोधित की जाती है, तो इसके लिए जंजीर की गई सभी चीजें तुरंत संशोधनों का उत्तराधिकारी होंगी। यदि किसी ऑब्जेक्ट में कोई विधि या प्रॉपर्टी नहीं है, तो जावास्क्रिप्ट कार्यान्वयन प्रोटोटाइप श्रृंखला का पालन करेगा जब तक कि उसे यह न मिले या यह असफल हो जाए।

__proto__ प्रोटोटाइप के लिए एक गैर मानक एक्सेसर है, जो ब्राउज़र में समर्थित है, लेकिन आईई द्वारा नहीं। वैसे भी आवेदन कोड द्वारा उपयोग नहीं किया जाना है।

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