2016-12-01 11 views
6

Google क्रोम के जावास्क्रिप्ट में, ऑब्जेक्ट्स की संपत्ति __proto__ है जो उनके प्रोटोटाइप (या पैरेंट) ऑब्जेक्ट को इंगित करती है।ऑब्जेक्ट .__ proto__ में क्या है?

var foo = {}; 
console.log(foo.__proto__ === Object.prototype); //returns true 

हालांकि, इस सच नहीं Object वस्तु के लिए है। Object.__proto__ समारोह क्या है -

console.log(Object.__proto__ === Object.prototype); //returns false 

Object.__proto__ संपत्ति एक खाली विधि

> console.log(Object.__proto__.toString()); 
function() {} 

परे एक चेतावनी कहानी के रूप में सेवारत जावास्क्रिप्ट सुविधाओं है कि मानक निकायों के बाहर शुरू पर निर्भर के बारे में प्रतीत होता है?

+4

'ऑब्जेक्ट .__ proto__ === फ़ंक्शन.प्रोटोटाइप' ... ऑब्जेक्ट एक फ़ंक्शन है। 'टाइप ऑब्जेक्ट === "फ़ंक्शन" ' –

+0

... और' __proto__' ईसीएमएस्क्रिप्ट 6 में जोड़ा गया था। –

+0

... और कारण' Function.prototype' एक खाली फ़ंक्शन प्रतीत होता है यह है कि कई प्रोटोटाइप अंतर्निर्मित रचनाकार वास्तव में उनके द्वारा बनाई गई वस्तु का एक उदाहरण हैं। उदाहरण के लिए, 'Array.isArray (Array.prototype); // true' (या शायद काफी उदाहरण नहीं है, लेकिन उनके पास कुछ रिश्तेदार के साथ कुछ रिश्ते हैं।) –

उत्तर

2

ऊपर squint's टिप्पणियों के आधार पर, मैं इस की तह तक पहुंचने के लिए सक्षम किया गया है। मेरी अस्थिर, गलत (और 10+ वर्ष) धारणा यह थी कि वैश्विक Object सहायक ऑब्जेक्ट की प्रोटोटाइप ऑब्जेक्ट जावास्क्रिप्ट की प्रोटोटाइप श्रृंखला के शीर्ष/अंत में शीर्ष प्रोटोटाइप का प्रोटोटाइप "प्रोटोटाइप" का शीर्ष स्तर था। यह सच नहीं है। खाली समारोह अपने प्रोटोटाइप वस्तु है कि -

Object सहायक ऑब्जेक्ट और Function सहायक ऑब्जेक्ट दोनों एक ही माता पिता के प्रोटोटाइप-वस्तु

console.log(Object.__proto__ === Function.__proto__); //true 

तो, कारण एक खाली कार्य करने के लिए Object.__proto__ अंक है Object ऑब्जेक्ट के लिए। यदि आप Object (.prototype का उपयोग किए बिना प्रोटोटाइप के प्रोटोटाइप पर जाना चाहते हैं), तो आपको थोड़ी देर वापस खोदने की आवश्यकता है।

console.log(Object.__proto__.__proto__ === Object.prototype);   //true 

मैं भी एक साथ एक त्वरित आरेख कि बाहर मानचित्र JavaScript के निचले स्तर सहायक/निर्माता वस्तुओं की कुछ के वास्तविक प्रोटोटाइप डाल दिया।

enter image description here

अंत में - मैं भी यह भी पता चला गूगल क्रोम Reflect वस्तु, which includes a getPrototypeOf method, जो Object.getPrototypeOf विधि के रूप में ही हो गया लगता है लागू किया गया है।

+0

पुन: नीचे-मतदाता - अगर ऊपर कुछ गलत है, तो कृपया मुझे बताएं। अगर यह सही है लेकिन आप मेरे दृष्टिकोण को नापसंद करते हैं - मुझे लगता है कि मैं साथ रहूंगा डाउनवोट्स;) –

+0

मुझे लगता है कि आप ठीक है, लेकिन ग्राफ भ्रमित है क्योंकि मैं तीर को दूसरी दिशा (विरासत की दिशा) को इंगित करने की अपेक्षा करता हूं। और यह वाक्य उलझन में है: * "ऑब्जेक्ट हेल्पर ऑब्जेक्ट फ़ंक्शन हेल्पर ऑब्जेक्ट के साथ अपना प्रोटोटाइप साझा करता है।" * वाक्यांश अस्पष्ट है। मैं तब नहीं बता सकता जब आप कन्स्ट्रक्टर फ़ंक्शंस, उनके '.prototype' या ऑब्जेक्ट से प्राप्त होते हैं (जिसे' __proto__' के माध्यम से सुलभ किया जाता है) के बारे में बात कर रहे हैं। तो यह DVs के कारण का हिस्सा हो सकता है। –

+0

'getPrototypeOf'' प्रतिबिंब 'ऑब्जेक्ट के साथ नया है, लेकिन यह' Object.getPrototypeOf' के माध्यम से काफी समय से आसपास रहा है। कम से कम मैं * सोचता हूं * वे वही हैं। वास्तव में अभी तक 'प्रतिबिंब' पर बहुत अधिक नहीं देखा है। संपादित करें: मैं दस्तावेज़ों पर देखता हूं कि वे वास्तव में वही हैं। अच्छा। –

6

ऑब्जेक्ट ग्राफ़ का शीर्ष spec में कहीं और अपेक्षाओं के साथ अधिक स्थिरता बनाए रखने के लिए बनाया गया है।

आवश्यक रूप से, ऐसा कोई बिंदु आता है जहां सामान्य ऑब्जेक्ट लिंक का उपयोग नहीं किया जा सकता क्योंकि आप "ऑब्जेक्ट से बाहर निकलते हैं"।

ऐसा JavaScript की बुनियादी समझ Object की [[Prototype]]Object समारोह-वस्तु बनाने के लिए इस्तेमाल किया समारोह के प्रोटोटाइप संपत्ति होने की उम्मीद करने के लिए हमें ले जाता है।

हम उम्मीद करते हैं Function रों Function समारोह-वस्तु का उपयोग कर बनाया जा करने के लिए है, तो ...

Object.__proto__ === Function.prototype 

क्योंकि हम वस्तु ग्राफ के शीर्ष पर हैं और अपेक्षित व्यवहार हम कॉन्फ़िगर की निरंतरता बनाए रखना चाहते हैं [[Prototype]]FunctionFunction.prototype होने के लिए।

Function.__proto__ === Function.prototype 

इस प्रकार Function instanceof Function === true सुनिश्चित करना।

हम दिखा सकते हैं कि Function.prototype एक विशेष समारोह-वस्तु है क्योंकि:

Function.prototype.prototype === undefined 

... और हर उपयोगकर्ता परिभाषित समारोह (वसा तीर के अलावा अन्य) अपने प्रोटोटाइप संपत्ति पर एक वस्तु है।

क्योंकि सब से ऊपर की

:

Object.__proto__ === Function.__proto__ 

यह अजीब लग सकता है सकते हैं, लेकिन जैसा कि पहले बताया गया है, वस्तु ग्राफ़ के शीर्ष पर हम उम्मीदवार वस्तुओं के एक सीमित सेट को इंगित करने के लिए है।

टीसी -39 अब [[Prototype]][[Prototype]]Object के [[Prototype]] की पहचान करने की आवश्यकता है। उपरोक्त के अनुसार हम जानते हैं कि [[Prototype]]ObjectFunction.prototype है।

कुछ अर्थों में हम अब ऑब्जेक्ट ग्राफ़ में Function.prototype से ऊपर हैं, इसलिए एक विशेष Object इंस्टेंस ("प्रोटोटाइप ऑब्जेक्ट") इस मान के लिए चुना गया था।

इसका मतलब है कि प्रत्येक प्रोटोटाइप श्रृंखला के शीर्ष को आसानी से Object.prototype से जोड़ा जा सकता है।

यह निश्चित रूप से इच्छाशील आवश्यकता को पूरा करता है कि सब कुछ "एक वस्तु है"।

Object.__proto__.__proto__ === Object.prototype 

इस बिंदु हम वस्तु ग्राफ पूरा करने की आवश्यकता पर है, इसलिए हम null होने की Object.prototype की [[Prototype]] निर्धारित किया है।

Object.__proto__.__proto__.__proto__ === null 
+0

उपयोगी जानकारी @ बेनास्टन - धन्यवाद! लेकिन मुझे यकीन नहीं है कि 'ऑब्जेक्ट .__ proto__' जानकारी सही है? ऑब्जेक्ट .__ प्रोटो __। टूस्ट्रिंग() 'रिटर्न '" फ़ंक्शन() {} "' - यानी एक खाली फ़ंक्शन, ** नहीं ** एक '[मूल कोड]' फ़ंक्शन (क्रोम, ओएस एक्स एल कैप)? पुन: मानक निकायों के बाहर, मेरा बयान/स्नर्क अस्पष्ट था। यह मेरी समझ है __proto__ को ईएस मानक का हिस्सा नहीं होने के बावजूद ब्राउज़र में लागू किया गया था, और हाल ही में इसे ES6 मानक में शामिल किया गया था। –

+0

'ऑब्जेक्ट .__ proto__ का प्रतिपादन।toString() 'आपके ब्राउज़र के संस्करण पर निर्भर करेगा। साथ ही: आप सी ++ स्रोत कोड को मुद्रित करने के लिए 'toString' चाहते हैं? यदि आप मुझ पर विश्वास नहीं करते हैं: मुझे बताएं कि उपयोगकर्ता-भूमि फ़ंक्शन ने अंतर्निहित 'ऑब्जेक्ट' फ़ंक्शन-ऑब्जेक्ट बनाया है? – Ben

+0

कारण मुझे यकीन नहीं है कि आपका विवरण 100% सटीक है, अगर मैं क्रोम के ब्राउज़र में देशी कोड के साथ फ़ंक्शन लॉग करता हूं, (या टूस्ट्रिंग विधि का उपयोग करता हूं), तो मुझे कुछ मिलता है जो [मूल कोड] ('फ़ंक्शन स्प्लिट'() {[मूल कोड]}। हालांकि, जब क्रोम (या '.toString') 'ऑब्जेक्ट .__ proto__' ऑब्जेक्ट प्रस्तुत करता है, इसमें मूल कोड शामिल नहीं होता है और एक खाली उपयोगकर्ता भूमि फ़ंक्शन (' फ़ंक्शन() {} ') –

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