__proto__
आप वास्तव में __proto__
के साथ एक वस्तु के आंतरिक [[Prototype]]
संपत्ति पहुँच सकते हैं। आप विरासत पदानुक्रम में वर्तमान वस्तु के वास्तविक अभिभावक के रूप में [[Prototype]]
के बारे में सोच सकते हैं।
prototype
यह एक विशेष संपत्ति है, जब एक (निर्माता) समारोह वस्तु, निर्माता से बनाए गए उदाहरणों के लिए विरासत श्रृंखला स्थापित करने के लिए प्रयोग किया जाता है पर निर्धारित किया है। उदाहरण के लिए,
function Foo() {}
Foo.prototype = {a: 1};
अब, जब आप प्रकार Foo
की एक नई वस्तु बनाने, नव निर्मित वस्तु के आंतरिक [[Prototype]]
संपत्ति Foo.prototype
वस्तु संदर्भित करेंगे। आपको लगता है कि इस
console.assert((new Foo()).__proto__ === Foo.prototype);
आपके मामले में की तरह इस बात की पुष्टि कर सकते हैं,
myFunc.prototype = myObj;
आप समारोह वस्तु पर एक prototype
संपत्ति पैदा कर रहे हैं और इस ही उपयोग किया जाएगा जब आप के साथ नई वस्तुओं का निर्माण कर रहे यह फ़ंक्शन (कन्स्ट्रक्टर फ़ंक्शन)। आप इसे नई वस्तुओं के लिए टेम्पलेट के रूप में सोचना चाहेंगे। इसलिए, जब आप myFunc.a
करते हैं, तो जेएस इंजन a
myFunc
और उसके माता-पिता प्रोटोटाइप श्रृंखला में खोजने की कोशिश करता है और इसे नहीं मिलता है, यही कारण है कि यह undefined
देता है।
लेकिन, जब तुम
myFunc.__proto__ = myObj;
आप myFunc
की मूल सेट कर रहे हैं, प्रोटोटाइप श्रृंखला में, myObj
करने के लिए। इसलिए, जब आप myFunc.a
करते हैं, तो जेएस इंजन पहले a
myFunc
ऑब्जेक्ट में खोजने की कोशिश करता है, और यह वहां नहीं है। इसलिए, यह इसे अपने तत्काल माता-पिता में ढूंढने का प्रयास करता है, जो myObj
है। यही कारण है कि इस मामले में यह 1
देता है।
नोट: आप निम्न समारोह प्रोटोटाइप श्रृंखला को समझने के लिए उपयोग कर सकते हैं बेहतर
function printPrototypeChain(object) {
while (object !== null) {
console.log(object);
object = Object.getPrototypeOf(object);
}
}
अब, हम प्रोटोटाइप श्रृंखला मुद्रित करते हैं जब वस्तु समारोह के prototype
संपत्ति के रूप में सेट किया गया है वस्तु।
function myFunc() {}
myFunc.prototype = {
a: 1,
b: 2
};
printPrototypeChain(myFunc);
उत्पादन इतना undefined
दिया जाता है हो जाएगा इन वस्तुओं में से
[Function: myFunc]
[Function: Empty]
{}
कोई नहीं a
परिभाषित किया गया है,। लेकिन, इस मामले में,
function myFunc() {}
myFunc.__proto__ = {
a: 1,
b: 2
};
printPrototypeChain(myFunc);
प्रोटोटाइप श्रृंखला इस
[Function: myFunc]
{ a: 1, b: 2 }
{}
और a
की तरह हो जाता है myFunc
के तत्काल माता पिता में पाया जाता है। तो, संबंधित मान 1
वापस कर दिया गया है।
नोट: अपने वास्तविक कोड में __proto__
का उपयोग न करें, क्योंकि इसे पिछड़ा संगतता के लिए जावास्क्रिप्ट विनिर्देश के नवीनतम संस्करणों में रखा गया है। इसके बारे में और पढ़ें here। इसके बजाय Object.getPrototypeOf
और Object.setPrototypeOf
का उपयोग करें।
http://es5.github.io/ बिल्कुल '__proto__' के बारे में कुछ भी नहीं जानता है। जिसका अर्थ है कि यह मानक का हिस्सा नहीं है और आपको इसका कभी भी उपयोग नहीं करना चाहिए। – zerkms
नहीं, किसी ऑब्जेक्ट का प्रोटोटाइप (जिसे इसके साथ विरासत में मिला है) ** ** नहीं है। प्रोप्रोटाइप'। क्या आपने http://stackoverflow.com/questions/9959727/proto-vs-prototype-in-javascript के सभी उत्तरों को पढ़ा है? आपने विशेष रूप से क्या नहीं समझा (हम उन्हें सुधारने में प्रसन्न हैं)? – Bergi
तो प्रोप्रोटाइप के लिए क्या उपयोग किया जाता है ?? – Flake