2013-07-20 3 views
6

के बीच अंतर मुझे पता है कि बाद वाला गैर-मानक है। लेकिन Object.getPrototypeOf बनाम __proto__ के बीच कोई अंतर है? मैं जांच कर रहा हूं कि जावास्क्रिप्ट में प्रोटोटाइप श्रृंखला कैसे काम करती है, और इस भाग पर स्पष्ट होना चाहती है।ऑब्जेक्ट .getPrototypeOf बनाम __proto__

धन्यवाद।

उत्तर

12

MDN से:

Object.getPrototypeOf() पुरानी और अस्वीकृत वस्तु .__ proto__ संपत्ति के मानक कार्यान्वयन है। हालांकि यह केवल पढ़ने योग्य विधि है।

तो मूल रूप से वे एक ही चीज़ को पूरा करते हैं यदि आप मूल्य पढ़ रहे हैं, __proto__ को छोड़कर गैर-मानक है। __proto__ संभावित रूप से आपको किसी मौजूदा ऑब्जेक्ट का प्रोटोटाइप सेट करने देता है, लेकिन आम तौर पर यह एक अच्छा विचार नहीं है, इसलिए मानक अब एक विशिष्ट प्रोटोटाइप के साथ ऑब्जेक्ट बनाने के लिए एक कन्स्ट्रक्टर फ़ंक्शन या Object.create का उपयोग करना होगा। उस ने कहा, ES6 spec भी किसी ऑब्जेक्ट के प्रोटोटाइप को सेट करने के लिए setPrototypeOf को परिभाषित करता है, हालांकि प्रदर्शन कारणों से, इसे तब तक टालना सर्वोत्तम होता है जब तक कि स्पष्ट रूप से आवश्यक न हो।

6

प्रारंभ में, __proto__ मोज़िला ब्राउज़र के प्रारंभिक संस्करणों (3.5 से पहले फ़ायरफ़ॉक्स) में मोज़िला-केवल हैक था। इसे केवल 2008 में ईसीएमएस्क्रिप्ट 3.1 में संहिताबद्ध किया गया था।

एक अंतर यह है कि __proto__ बदला जा सकता है (हालांकि एक खराब डिजाइन अभ्यास) जबकि getPrototypeOf एक पठन समारोह है। एक get रूप

var myObject = { __proto__ : "conflicts", getPrototypeOf : function() {return "does not conflict"} }; 
console.log(myObject.getPrototypeOf()); // "does not conflict" 
// all objects inherit from Object.prototype, not Object, so there is no conflict 
console.log(Object.getPrototypeOf(myObject)) // Object {} 
console.log(myObject.__proto__); // Object {}, the value "conflicts" is lost 
+0

नाम संघर्ष को इंगित करने के लिए धन्यवाद, जानना अच्छा है। – simonzack

0

Proxy व्यवहार करता है <__proto__>:

_ = new Proxy({}, { 
    get:z=>console.log('a'), 
    getPrototypeOf:z=>console.log('b'), 
}); 
_.__proto__/*a*/ 

— और <getPrototypeOf> रूप

var parentObject = {"parentKey" : "parentValue"}; 
var childObject = {"childKey" : "childValue"}; 
childObject.__proto__ = parentObject; 
console.log(childObject.parentKey); // parentValue 
Object.getPrototypeOf(childObject) = {"parentKey" : "newValue"}; 
// ReferenceError: Invalid left-hand side in assignment 

एक और अंतर यह है कि वे कैसे एक नाम संघर्ष की संभावना नहीं मामले को संभालने है एक getPrototypeOf:

_ = new Proxy({}, { 
    get:z=>console.log('a'), 
    getPrototypeOf:z=>console.log('b'), 
}); 
Object.getPrototypeOf(_)/*b*/ 
संबंधित मुद्दे