2011-10-03 19 views
5

मैंने हमेशा यह माना है कि किसी फ़ंक्शन का प्रोटोटाइप सभी ऑब्जेक्ट्स के संदर्भ में संदर्भ में साझा किया गया था। इसलिए यदि आप प्रोटोटाइप की किसी संपत्ति के मूल्य को बदलते हैं, तो उस प्रोटोटाइप को साझा करने वाली सभी ऑब्जेक्ट्स में उनके लिए मान भी बदलते हैं। तो नीचे उदाहरण के लिए ऐसा लगता है कि संपत्ति ऑब्जेक्ट की बजाय सभी वस्तुओं के बीच साझा किया जा रहा है, इसकी प्रतिलिपि बनाई गई है। क्या यह सही है? क्या रचनाकार के प्रोटोटाइप के गुण बस सभी वर्ग वस्तुओं के लिए कॉपी किए गए हैं, या वे लिंक द्वारा साझा किए जाते हैं?जावास्क्रिप्ट और फ़ंक्शन प्रोटोटाइप असाइनमेंट

function foo() 
{ 
    this.bar = 1; 
} 
function derived() { } 
derived.prototype = new foo() 

object1 = new derived() 
object2 = new derived() 

object1.bar = 2; 
//but notice if I had said here derived.prototype.bar = 3, object1.bar would still equal 2 but object2.bar would equal 3 
alert(object2.bar) // this prints 1; 

उत्तर

12

जब आप आवंटित object1.bar = 2, आप object1 पर एक अपनी संपत्ति बना रहे हैं, इस संपत्ति है कि वस्तु उदाहरण में मौजूद हो, और वह अपने प्रोटोटाइप के साथ कोई संबंध नहीं है।

पर object1 होगा छाया यह गुण एक derived.prototype पर मौजूदा का मूल्य है, जिसका अर्थ यह है कि आप object1.bar देखने जब, सीधे उस वस्तु पर मौजूदा एक मूल्य मिल जाएगा।

दूसरी ओर, यदि आप object2.bar देखने, इस वस्तु एक खुद bar संपत्ति है, तो संपत्ति देखने वस्तु इस एक (derived.prototype) से विरासत पर खोज करेंगे नहीं है और यह मूल्य 1 मिल जाएगा।

आपका वस्तु संरचना इस तरह दिखता है:

 
object1 
-------- 
| bar: 2 | ----------------- 
--------     |   derived.prototype 
          |  ---------- 
          |------> | bar: 1 | -- foo.prototype 
object2 (no own properties)|  ---------- | ------------------ 
--------     |      -> | constructor: foo | 
|  | -----------------       ------------------ 
--------             | 
                  v 
                ------------------ 
                | Object.prototype | 
                ------------------ 
                  | 
                  v 
                  null 

कहाँ ---> लाइनों निरूपित आंतरिक [[Prototype]] लिंक है कि विरासत व्यक्त करता है।

function Animal() { 
} 
Animal.prototype.name="animal"; 

function Dog() { 
} 
Dog.prototype = new Animal 
Dog.prototype.constructor=Dog; 
Dog.prototype.name="dog"; 

object1 = new Animal(); 
object2 = new Dog(); 

एक परिणाम आप दो वस्तु मामले हैं तो उस के रूप में देखा के रूप में (आप Chrome DevTools या एफएफ फ़ायरबग या ... में उदाहरण के लिए इस जाँच कर सकते हैं):

+0

ओह, सही समझ में आता है, इसलिए जब तक मैं इसे फिर से असाइन नहीं करता, यह विरासत संपत्ति को संदर्भित करता है, इसलिए एक बार जब मैं इसे अपनी संपत्ति बना देता हूं? – rubixibuc

+0

मुझे अब यह मिला, कि आरेख ने बहुत मदद की, आपका बहुत बहुत धन्यवाद, आपका जवाब बहुत बढ़िया था :-) – rubixibuc

+0

@ रुबिक्सिबुक, ठीक है, एक बार जब आप इसे असाइन करते हैं, तो यह अपनी संपत्ति बन जाएगा और यह * छाया * किसी भी मूल्य को बढ़ाएगा प्रोटोटाइप श्रृंखला में। यह भी ध्यान रखें कि 'ऑब्जेक्ट 1' और 'ऑब्जेक्ट 2' बनाने के बाद '[[प्रोटोटाइप]] लिंक को बदला नहीं जा सकता है, उदाहरण के लिए,' ऑब्जेक्ट 1 'और' ऑब्जेक्ट 2 'बनाने के बाद, आप' derived.prototype' पर एक अलग ऑब्जेक्ट को फिर से सौंपेंगे, इससे प्रभावित नहीं होगा गुण उन दो वस्तुओं द्वारा विरासत में मिला। – CMS

2

उदाहरण के लिए, आप कोड है

alert(object1.name); // displayed "animal" 
alert(object2.name); // displayed "dog" 

क्या हुआ:

object1: 
    __proto__: (is ref into an Animal.prototype object) 
    constructor: function Animal() 
    name: "animal" 
    __proto__: Object (is ref into an Object.prototype object) 

object2: 
    __proto__: (is ref into an Dog.prototype object) 
    constructor: function Dog() 
    name: "dog" 
    __proto__: (is ref into an Animal.prototype object) 
     constructor: function Animal() 
     name: "animal" 
     __proto__: (is ref into an Object.prototype object) 

आप (उदाहरण के लिए) अगले कोड चलाते हैं? 1) जावास्क्रिप्ट ऑब्जेक्ट इंस्टेंस में प्रॉपर्टी नेम की तलाश में था (object1 या object2 में)। 2) जब नहीं मिला, तो यह ऑब्जेक्ट इंस्टेंस प्रोटो प्रॉपर्टी (जो वर्ग फ़ंक्शन के प्रोटोटाइप के समान है) में देखा गया। 3) जब founct नहीं यह आद्य आद्य और अगले और अगले जबकि नहीं मिला name संपत्ति और दूसरों आद्य पाया की में देखा। यदि खोज संपत्ति के परिणामस्वरूप पाया जाता है, तो मूल्य वापस नहीं किया जाता है, यदि नहीं मिला, तो undefined लौटा।

यदि आप अगले कोड निष्पादित क्या हुआ:

object2.name = "doggy"; 

एक परिणाम आप object2 के लिए है के रूप में:

object2: 
    name: "doggy" 
    __proto__: (is ref into an Dog.prototype object) 
    constructor: function Dog() 
    name: "dog" 
    __proto__: (is ref into an Animal.prototype object) 
     constructor: function Animal() 
     name: "animal" 
     __proto__: (is ref into an Object.prototype object) 

संपत्ति सीधे उदाहरण वस्तु में असाइन किया गया है, लेकिन प्रोटोटाइप वस्तु अपरिवर्तित रहता है।और जब तुम पर अमल: |: 1)

Animal.prototype.secondName="aaa"; 
alert(object1.secondName); // displayed "aaa" 
alert(object2.secondName); // displayed "aaa" 
Animal.prototype.secondName="bbb"; 
alert(object1.secondName); // displayed "bbb" 
alert(object2.secondName); // displayed "bbb" 
// but 
Animal.prototype.secondName="ccc"; 
object1.secondName="ddd"; 
alert(object1.secondName); // displayed "ccc" 
alert(object2.secondName); // displayed "ddd" 

2)

alert(object1.name); // displayed "animal" 
alert(object2.name); // displayed "doggy" 

आप बनाने की जरूरत जब परिवर्तन वर्ग के संपत्ति, तो आप अगले एल्गोरिदम से एक का उपयोग कर सकते हैं साझा फ़ंक्शन क्लास के प्रोटोटाइप में object टाइप करें और इस ऑब्जेक्ट के गुणों को मान असाइन करें।

Animal.prototype.propObject={thirdName:"zzz"}; 
alert(object1.propObject.thirdName); // displayed "zzz" 
alert(object2.propObject.thirdName); // displayed "zzz" 
Animal.prototype.propObject.thirdName="yyy"; 
alert(object1.propObject.thirdName); // displayed "yyy" 
alert(object2.propObject.thirdName); // displayed "yyy" 
object1.propObject.thirdName="xxx"; 
alert(object1.propObject.thirdName); // displayed "xxx" 
alert(object2.propObject.thirdName); // displayed "xxx" 
object2.propObject.thirdName="www"; 
alert(object1.propObject.thirdName); // displayed "www" 
alert(object2.propObject.thirdName); // displayed "www" 
+0

अच्छी तरह से समझाया गया। –

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