2011-03-13 5 views
7

निम्नलिखित कोड में, क्या x सदस्य को नेस्टेड ऑब्जेक्ट शाब्दिक से एक्सेस किया जा सकता है?किसी नेस्टेड ऑब्जेक्ट से शाब्दिक सदस्य को कैसे पहुंचाया जा सकता है?

var outer = { 
    x : 0, 
    inner: { 
     a : x + 1,  // 'x' is undefined. 
     b : outer.x + 1, // 'outer' is undefined. 
     c : this.x + 1 // This doesn't produce an error, 
    }     // but outer.inner.c is NaN. 
} 
+0

Int eresting। यकीन नहीं है कि यह बिल्कुल हो सकता है। –

उत्तर

9

जिस तरह से आप इसे डालते हैं - नहीं।

आप दो चरणों निर्माण की जरूरत है, इस काम करेगा:

var outer = { x : 0 }; 
// outer is constructed at this point. 
outer.inner = { 
     b : outer.x + 1 // 'outer' is defined here. 
}; 
4

आपके निर्माण में नहीं, नहीं।

मुख्य कारण यह है कि outer वास्तव में तब तक मौजूद नहीं है जब आप inner के अंदर हों।

यदि आपने inner के गुणों को बदलने के लिए गुणों को बदल दिया है तो आप रनटाइम पर outer तक पहुंच सकते हैं, लेकिन यह बहुत बदसूरत कोड होगा।

बजाय new outer(); उपयोग पर विचार करें और एक वस्तु है कि जिस तरह से है, तो आप thisinner अंदर उपयोग कर सकते हैं का निर्माण, लेकिन तब है कि एक पूरी तरह से अलग निर्माण है और तरह

var outer = function() { 
    this.x = 0; 
    this.inner = { 
     a: this.x + 1 
    };      
}; 

var b = new outer(); 

console.log(b.inner.a); // 1 
0

मुझे नहीं लगता कि उस तरह कुछ ऐसा दिखाई देगा निर्माण का अर्थ होगा। मुझे नहीं लगता कि

var outer2; 
outer2.inner = outer.inner; 

उस परिदृश्य में, आप दोनों माता-पिता के बीच अंतर कैसे करेंगे?

ऐसा करने का तरीका संभवतः एक कन्स्ट्रक्टर प्रकार फ़ंक्शन के साथ है, जो पैरामीटर के साथ बाहरी.एक्स और आंतरिक को सौंपा जाता है। जो भी आवश्यक हो।

0

तुम भी एक बंद इस्तेमाल कर सकते हैं:

var outer = function outer() { 

    var x = 0; 

    return { 
     inner : { 
      a: x + 1 
      } 
     }     
}; 

var b = outer(); 
console.log('a is ' + b.inner.a); 
//a is 1 

बंद पर एक बड़ा लेख के लिए बाहर की जाँच जावास्क्रिप्ट उद्यान

http://bonsaiden.github.com/JavaScript-Garden/#closures

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

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