2011-12-04 20 views
5

मैं एक कोलाहल वस्तु के साथ मेरी समस्या का एक सरल उदाहरण दिया:जावास्क्रिप्ट ऑब्जेक्ट को कैसे विस्तारित किया जाए?

function babel(){ 
    this.english = { 
     hello: function() { alert('hello'); }, 
     goodbye: function() { alert('goodbye'); } 
     teeshirt: function() { alert('T-shirt'); } 
    } 
} 

अब, मैं चाहता हूँ इस वस्तु का विस्तार:

babel.prototype.french = { 
    bonjour: function() { alert('bonjour'); }, 
    aurevoir: function() { alert('au revoir'); } 
} 

लेकिन क्या होगा अगर मैंने पहले परिभाषित एक मौजूदा समारोह उपयोग करने की आवश्यकता ? यह

var say = new babel(); 

(function (_this) { 
    babel.prototype.french = { 
    bonjour: function() { alert('bonjour'); }, 
    aurevoir: function() { alert('aurevoir'); }, 
    hello: function() { _this.english.hello(); } 
    } 
})(say); 

लेकिन इस मामले में, मैं हमेशा कहते हैं वस्तु के संदर्भ का उपयोग करेगा, नहीं है:

babel.prototype.french = { 
    bonjour: function() { alert('bonjour'); }, 
    aurevoir: function() { alert('aurevoir'); }, 
    teeshirt: function() { this.english.teeshirt(); } 
} 

क्या मैं कर सकता है?

+2

[जावास्क्रिप्ट ऑब्जेक्ट से एक्सेस अभिभावक के माता-पिता] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/183702/access-parents-parent-from-javascript-object) – JJJ

+0

क्या आप चाहते हैं 'var b = नया बेबेल(); बी.फ्रेंच.टेशर्ट(); 'टी-शर्ट "को सतर्क करने के लिए? या कुछ अन्य व्यवहार? –

+0

हां, यह वह व्यवहार है जिसे मैं पसंद करूंगा, लेकिन इसके अलावा, मैं अपने ऑब्जेक्ट के संदर्भ का उपयोग करना चाहता हूं। – Natim

उत्तर

4

समस्या यह है कि teeshirt फ़ंक्शन में इस बिंदु को फ्रेंच ऑब्जेक्ट पर कॉल करें, बेबेल ऑब्जेक्ट नहीं। यदि आपको मूल ऑब्जेक्ट तक पहुंचना है, तो आपको इसे कहीं भी संदर्भित करना चाहिए। उदाहरण के लिए आप इस तरह अपने निर्माता बदल सकते हैं:

function babel(){ 
    this.english = { 
     parent: this, 
     hello: function() { alert('hello'); }, 
     goodbye: function() { alert('goodbye'); } 
     teeshirt: function() { this.parent.french.something(); } 
    } 
} 

लेकिन जैसा कि आप देख सकते हैं, वहाँ एक समस्या है, तो आप निर्माता में वस्तु बनाने नहीं है। मैं किसी भी 'अच्छा' दृष्टिकोण नहीं दिख रहा है, लेकिन आप यह कर सकते हैं:

function babel(){ 
    this.english = { 
     parent: this, 
     hello: function() { alert('hello'); }, 
     goodbye: function() { alert('goodbye'); } 
     teeshirt: function() { this.parent.french.something(); } 
    }; 
    for (var i in babel.prototype) { 
     this[i].parent = this; 
    } 
} 

फिर अपने फ्रेंच इस तरह दिखेगा:

babel.prototype.french = { 
    bonjour: function() { alert('bonjour'); }, 
    aurevoir: function() { alert('aurevoir'); }, 
    teeshirt: function() { this.parent.english.teeshirt(); } 
} 
+0

ठीक है यह अच्छा है :) – Natim

2

सवाल के रूप में पूछा की परवरिश करता है सभी आकर्षक जावास्क्रिप्ट के this और प्रोटोटाइप विरासत के साथ समस्याएं, मैं पूरी समस्या को सरल बनाने और अपनी वस्तुओं को पुन: सक्रिय करने का सुझाव दूंगा। ऐसा करने के कुछ तरीके हैं।

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

अब यह विचार आपके लिए काम नहीं कर सकता है, क्योंकि विभिन्न बंडलों के बीच संबंध जटिल हो सकता है: शायद कभी-कभी एंजिश एक फॉलबैक कभी-कभी है लेकिन अन्य बार नहीं। इस मामले में, देखें कि क्या आप अपने बेबेल ऑब्जेक्ट्स को सभी सिंगलेट्स (यानी, केवल सादे ऑब्जेक्ट्स) बना सकते हैं।

var babel = {} 

babel.english = { 
    hello: function() { alert('hello'); }, 
    goodbye: function() { alert('goodbye'); }, 
    teeshirt: function() { alert('T-shirt'); } 
} 

babel.french = { 
    bonjour: function() { alert('bonjour'); }, 
    aurevoir: function() { alert('aurevoir'); }, 
    teeshirt: function() { babel.english.teeshirt(); } 
} 

babel.english.teeshirt(); 
babel.french.teeshirt(); 

http://jsfiddle.net/yRnLj/

पर यह प्रयास करें मैं इस अपने दिलचस्प सवाल की एक पूरी परिहार की तरह दिखता है एहसास। लेकिन अगर आपको केवल प्रत्येक भाषा बंडल की एक प्रति की आवश्यकता है, तो यह बहुत आसान है। :-)

+0

यह इस उदाहरण के लिए इंद्रियां बनाता है, लेकिन मुझे अवधारणा में रूचि थी। धन्यवाद। – Natim

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

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