2012-05-01 14 views
5

जावास्क्रिप्ट में आप किसी प्रकार के extend फ़ंक्शन का उपयोग करके ऑब्जेक्ट्स लिख सकते हैं।ऑब्जेक्ट्स लिखते समय नाम संघर्ष से कैसे बचें

उदाहरण के लिए मैं एक observable वर्ग कि सार्वजनिक तरीकों का एक सेट को उजागर करता है (get, push, set, increment, get, आदि) इस मामले में

हो सकता है नमूदार भी एक EventEmitter होने के लिए यह इतना भी होता है एक और (आदि emit, on, removeListener,) सार्वजनिक विधियों में से सेट

इन कक्षाओं के दोनों आंतरिक अंडरस्कोर उपसर्ग के गुण है कि राज्य की दुकान है उजागर करता है। इवेंटमेटर _events का उपयोग ईवेंट हैंडलर को स्टोर करने के लिए करता है और _state और _id को स्टोर करने के लिए अवलोकन योग्य उपयोग करता है।

अब जब मैं की तरह तो

var Model = extend({}, Observable, { 
    constructor: function() { 
     // Oops, I was supposed to know Observable uses the _state name already 
     this._state = { ... } 
    }, 
    someMethod: function() { ... } 
}) 

यह एक मुद्दा है क्योंकि Observable पहले से ही _state आंतरिक संपत्ति का उपयोग करता है और अब वहाँ एक नाम संघर्ष है का कारण बनता है वस्तु रचना का उपयोग कर एक मॉडल बनाने के।

मैं इसे "जानना चाहता हूं" के लिए बदसूरत मानता हूं कि मसालों के सुरक्षित रूप से काम करने के लिए आंतरिक गुणों पर निर्भर वस्तुओं पर निर्भर करता है।

आप दो वस्तुओं में मिश्रण से कैसे बचते हैं जो समान आंतरिक संपत्ति नाम का उपयोग करते हैं?

आदर्श रूप से यह ES6 निजी नामों के साथ हल किया जाएगा, लेकिन हम अभी तक ऐसा नहीं कर सकते हैं और हम प्रदर्शन खोने के बिना उन्हें अनुकरण नहीं कर सकते हैं। जब तक आप एक ईएस 6 नाम अनुकरण प्रदान नहीं कर सकते हैं कि में कोई बड़ा प्रदर्शन जुर्माना नहीं है मुझे उन समाधानों में कोई दिलचस्पी नहीं है।

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

+0

अच्छा सवाल ..! – Alnitak

+0

यदि मेमोरी परोसा जाता है, तो एक्स्टजेस ऑब्जेक्ट निर्माण पाइपलाइन में ऑब्जेक्ट इमिटर को अवलोकन से लटकने वाली संपत्ति के रूप में तत्काल करके, और इवेंटइमीटर के सभी * सार्वजनिक * विधियों को फंक्शन बाइंडिंग का उपयोग करके अवलोकन में हल करता है, जबकि ईवेंट इमिटर के अंदर सभी निजी राज्य को बनाए रखते हुए । मैं एक उदाहरण कोड दूंगा लेकिन मैं AFK जा रहा हूं ... मुझे एक घंटा दें? – zetlen

+0

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

उत्तर

0

तुच्छ समाधान "नामस्थान" है

var state = "[email protected]~state"; 
var Model = extend({}, Observable, { 
    constructor: function() { 
     // Nice, I used a namespace and don't clash with "[email protected]~state" 
     this[state] = { ... } 
    }, 
    someMethod: function() { ... } 
})