बस जब मैंने सोचा कि मैं जे एस पता लगा था, मैं इस पर लटका दिया हो:instanced वस्तु और गुण है कि संदर्भ हैं
function Obj() {
console.log('x: %s, o.x: %s', this.x++, this.o.x++);
}
Obj.prototype.x = 1;
Obj.prototype.o = {x: 1};
अपेक्षित:
> new Obj
x: 1, o.x: 1
> new Obj
x: 1, o.x: 1
> new Obj
x: 1, o.x: 1
वास्तविक:
> new Obj
x: 1, o.x: 1
> new Obj
x: 1, o.x: 2
> new Obj
x: 1, o.x: 3
तो, ऐसा लगता है कि यदि प्रोटोटाइप प्रॉपर्टी एक संदर्भ प्रकार है, तो यह सभी मामलों में साझा की जाती है, फिर भी यदि यह एक गैर-संदर्भ प्रकार है यह प्रत्येक उदाहरण के लिए पुन: प्रारंभ किया गया है; इस परिकल्पना की पुष्टि करने के लिए, मैंने कुछ अन्य प्रकारों का परीक्षण किया, जैसे string
(जो number
जैसा व्यवहार करता है) और array
(जो object
जैसा व्यवहार करता है)।
मैं निर्धारित किया है कि अगर मैं ctor में वस्तु संपत्ति reinitialize, इस तरह है कि मैं इस चूक से बचने कर सकते हैं:
function Obj() {
this.o = {x: 1};
}
सिर्फ वास्तव में अपरंपरागत लगता है कौन सा (कि मैं मैन्युअल रूप से गुण
reinitialize करने के लिए आवश्यक होगी
लेकिन केवल अगर वे एक संदर्भ वस्तु हैं)।
क्या कोई भी क्या हो रहा है पर कुछ प्रकाश डाल सकता है?
'(नया ओब्जे) .o === (नया ओब्जे) .o' - [विरासत] गुण सभी एक ही ऑब्जेक्ट को इंगित करते हैं, जिसका 'x' प्रॉपर्टी आप बढ़ती है। – Bergi
* ".. जैसे स्ट्रिंग (जो संख्या की तरह व्यवहार करती है) और सरणी (जो ऑब्जेक्ट की तरह व्यवहार करती है) .." * अच्छी तरह से, प्राइमेटिव्स को मूल्य (तार, संख्या, बूलियन) द्वारा कॉपी किया जाता है जबकि ऑब्जेक्ट्स (हाँ, 'सरणी' एक है वस्तु भी) संदर्भ द्वारा प्रतिलिपि बनाई गई हैं। बात यह है कि जब आप 'ओ' ऑब्जेक्ट की 'x' प्रॉपर्टी को संशोधित करते हैं, तो आप प्रोटोटाइप श्रृंखला में उसी' ओ 'ऑब्जेक्ट के संदर्भ को संशोधित कर रहे हैं। –