2013-03-11 9 views
5

के बीच अंतर मैं __proto__ और Object.create विधि के बीच का अंतर जानना चाहता हूं। इस उदाहरण लें:प्रोटो लिंक और ऑब्जेक्ट.क्रेट

var ob1 = {a:1}; 
var ob2 = Object.create(ob1); 

ob2.__proto__ === ob1; // TRUE 

इसका मतलब है Object.create विधि एक नई वस्तु बनाता है और पैरामीटर के रूप में प्राप्त करने के लिए वस्तु __proto__ लिंक सेट। हम विधि बनाने का उपयोग करने के बजाय सीधे __proto__ लिंक का उपयोग क्यों नहीं करते हैं?

+1

1. __proto__' गैर मानक है। 2)। 'Object.create' दूसरे पैरामीटर को स्वीकार कर सकता है जो उपयोगी हो सकता है। – dfsq

+1

ध्यान देने योग्य एक अन्य अंतर यह है कि '__proto__' आपको किसी मौजूदा ऑब्जेक्ट के प्रोटोटाइप को एक अलग प्रोटोटाइप पर सेट करने की अनुमति देता है, जबकि मानक जावास्क्रिप्ट (यहां तक ​​कि ईसीएमएस्क्रिप्ट 5 में भी) के साथ, केवल * प्रोटोटाइप प्राप्त करने के लिए संभव है (ऑब्जेक्ट के साथ .getPrototypeOf'), * सेट * सेट करने के लिए नहीं। –

+0

हम दूसरे पैरामीटर के रूप में क्या पारित कर सकते हैं? – sachinjain024

उत्तर

3

__proto__ गैर मानक है और इसे हर जगह समर्थित नहीं किया जाएगा। Object.create आधिकारिक विशिष्टता का हिस्सा है और आगे बढ़ने वाले हर पर्यावरण द्वारा समर्थित होना चाहिए।

यह विभिन्न स्थानों पर अलग-अलग लागू किया गया है।

Effective Javascript से:

वातावरण, उदाहरण के लिए भिन्न होते हैं, एक अशक्त प्रोटोटाइप के साथ वस्तुओं के इलाज पर। कुछ वातावरण में, __proto__ Object.prototype से विरासत में मिला है, इसलिए एक अशक्त प्रोटोटाइप के साथ एक वस्तु कोई विशेष __proto__ संपत्ति

आगे वस्तुओं को बनाने और Object.create समारोह को लागू विरासत है के लिए स्वीकार तरह से चलती है, और अगर आपको प्रोटोटाइप तक पहुंचने की आवश्यकता है, आप Object.getPrototypeOf का उपयोग करना चाहेंगे इन कार्यों को मानकीकृत किया गया है और उन्हें सभी आधुनिक वातावरण

+0

"निर्माण" शब्द भ्रम के लिए कॉल करता है। मैंने सोचा कि यह एक नई वस्तु बना रहा है और इसकी संपत्ति को कॉपी कर रहा है es लेकिन अब मुझे यह मिल गया। धन्यवाद :) – sachinjain024

+0

'Object.create' एक नई वस्तु बनाते हैं। पहला तर्क नया प्रोटोटाइप है, दूसरा आपको गुणों की प्रतिलिपि बनाने देता है। यहां और देखें: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create –

+0

'__proto__' अब ES6 मानक का हिस्सा है: http: //www.ecma- international.org/ecma-262/6.0/index.html#sec-object.prototype.__proto__ – John

3

हम विधि विधि का उपयोग करने के बजाय सीधे प्रोटो लिंक का उपयोग क्यों नहीं करते हैं?

क्योंकि __proto__ एक अमानक संपत्ति और हर ब्राउज़र में इसलिए जरूरी उपलब्ध नहीं है।

हालांकि यह ES.next के लिए माना जाता था। अधिक जानकारी: MDN - __proto__

+0

'__proto__' अब हिस्सा है मानक: http://www.ecma-international.org/ecma-262/6.0/index.html#sec-object.prototype.__proto__ – John

+0

@ जॉन: हां और नहीं। यह एनेक्स बी में है, जो कहता है * "यह अनुबंध विभिन्न विरासत सुविधाओं और वेब ब्राउज़र आधारित ईसीएमएस्क्रिप्ट कार्यान्वयन की अन्य विशेषताओं का वर्णन करता है। इस अनुबंध में निर्दिष्ट सभी भाषा सुविधाओं और व्यवहारों में एक या अधिक अवांछनीय विशेषताएं हैं और विरासत उपयोग की अनुपस्थिति में इस विनिर्देश से हटा दिया जाए। "* और *" इन सुविधाओं को कोर ईसीएमएस्क्रिप्ट भाषा का हिस्सा नहीं माना जाता है।प्रोग्रामर को नए ईसीएमएस्क्रिप्ट कोड लिखते समय इन विशेषताओं और व्यवहारों के अस्तित्व का उपयोग या आकलन नहीं करना चाहिए। "* –

+0

लेकिन इससे पहले यह कहता है: इस अनुबंध में परिभाषित ईसीएमएस्क्रिप्ट भाषा वाक्यविन्यास और अर्थशास्त्र __required__ हैं जब ईसीएमएस्क्रिप्ट होस्ट एक वेब ब्राउज़र है। – John

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