javascript - AngularJS में स्कोप प्रोटोटाइप/प्रोटोटाइपिकल विरासत की बारीकियों क्या हैं?




inheritance prototype (2)

एपीआई संदर्भ स्कोप पेज कहता है:

एक दायरा माता-पिता के दायरे से प्राप्त हो सकता है

डेवलपर गाइड स्कोप पेज कहता है:

एक दायरा (प्रोटोटाइपिक रूप से) अपने मूल दायरे से गुण प्राप्त करता है।

तो, क्या एक बच्चे का दायरा हमेशा अपने माता-पिता के दायरे से प्रोटोटाइपिक रूप से वारिस करता है? क्या अपवाद हैं? जब यह वारिस करता है, तो क्या यह हमेशा सामान्य जावास्क्रिप्ट प्रोटोटाइप विरासत है?


मैं @Scott Driscoll उत्तर में जावास्क्रिप्ट के साथ प्रोटोटाइपिकल विरासत का एक उदाहरण जोड़ना चाहता हूं। हम Object.create () के साथ शास्त्रीय विरासत पैटर्न का उपयोग करेंगे जो एक्मास्क्रिप्ट 5 विनिर्देश का एक हिस्सा है।

सबसे पहले हम "अभिभावक" ऑब्जेक्ट फ़ंक्शन बनाते हैं

function Parent(){

}

फिर "पैरेंट" ऑब्जेक्ट फ़ंक्शन में प्रोटोटाइप जोड़ें

 Parent.prototype = {
 primitive : 1,
 object : {
    one : 1
   }
}

"चाइल्ड" ऑब्जेक्ट फ़ंक्शन बनाएं

function Child(){

}

बाल प्रोटोटाइप असाइन करें (बाल प्रोटोटाइप को पैरेंट प्रोटोटाइप से प्राप्त करें)

Child.prototype = Object.create(Parent.prototype);

उचित "चाइल्ड" प्रोटोटाइप कन्स्ट्रक्टर असाइन करें

Child.prototype.constructor = Child;

बाल प्रोटोटाइप में विधि "परिवर्तनप्रॉप" जोड़ें, जो बाल वस्तु में "आदिम" संपत्ति मान को फिर से लिख देगा और बाल और अभिभावक वस्तुओं में "object.one" मान को बदल देगा

Child.prototype.changeProps = function(){
    this.primitive = 2;
    this.object.one = 2;
};

अभिभावक (पिता) और बच्चे (बेटे) वस्तुओं को शुरू करें।

var dad = new Parent();
var son = new Child();

कॉल चाइल्ड (बेटा) परिवर्तनप्रॉप विधि

son.changeProps();

परिणाम जांचें।

अभिभावक आदिम संपत्ति नहीं बदली

console.log(dad.primitive); /* 1 */

बाल आदिम संपत्ति बदल दी (पुनः लिखा)

console.log(son.primitive); /* 2 */

अभिभावक और बाल वस्तु। एक गुण बदल गया

console.log(dad.object.one); /* 2 */
console.log(son.object.one); /* 2 */

यहां उदाहरण का काम http://jsbin.com/xexurukiso/1/edit/

Object.create पर अधिक जानकारी https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/create


मैं मार्क के जवाब के साथ प्रतिस्पर्धा नहीं करना चाहता हूं, लेकिन सिर्फ उस टुकड़े को हाइलाइट करना चाहता था जिसने आखिरकार सबकुछ जावास्क्रिप्ट विरासत और इसकी प्रोटोटाइप श्रृंखला में किसी नए व्यक्ति के रूप में क्लिक किया।

केवल संपत्ति ही प्रोटोटाइप श्रृंखला की खोज करती है, लिखती नहीं है। तो जब आप सेट करते हैं

myObject.prop = '123';

यह श्रृंखला को नहीं देखता है, लेकिन जब आप सेट करते हैं

myObject.myThing.prop = '123';

उस लेखन ऑपरेशन के भीतर एक सूक्ष्म पढ़ा जा रहा है जो अपने प्रोप को लिखने से पहले myThing को देखने की कोशिश करता है। इसलिए यही कारण है कि बच्चे से ऑब्जेक्ट.प्रोपर्टीज को लिखना माता-पिता की वस्तुओं पर मिलता है।







prototypal-inheritance