2012-08-27 17 views
10

हम इस तरह Em.Object बना सकते हैं:Ember.Object में निजी विधि/संपत्ति कैसे बनाएं?

var foo = Em.Object.create({ 
    somevar : '123' 
}); 

और फिर इसे का उपयोग करें:

foo.get('somevar'); 

लेकिन कैसे एक निजी संपत्ति या Em.Object में विधि बनाने के लिए जो वस्तु से सुलभ हो जाएगा लेकिन हमारा पक्ष नहीं होगा?

उत्तर

5

यह संभव नहीं है, क्योंकि एम्बर.जेएस किसी भी encapsulation तंत्र प्रदान नहीं करता है।

हालांकि, आप बस निजी सदस्यों के लिए कुछ सम्मेलन का उपयोग कर सकते हैं। उदाहरण के लिए, _ साइन के साथ उन्हें उपसर्ग करें।

+0

इसे मिला, thanx! दिलचस्प, एम्बर के लेखक इस प्रकार की कार्यक्षमता के साथ प्रतिबद्ध हैं –

+1

आगंतुकों के लिए पांच साल बाद यहां आने के लिए, कृपया ध्यान रखें कि यह (स्वीकृत) उत्तर गलत है। –

0

आप एक बंद इस्तेमाल कर सकते हैं:

(function() { 
    var somePrivateProperty = 'xyz'; 

    MyObject = Em.Object.extend({ 
     someComputedProperty: function() { 
      return 'somePrivateProperty = ' + somePrivateProperty; 
     }).property() 
    }) 
})(); 
+0

हाँ, लेकिन MyObject.get ('somecomputedProperty') लगभग –

+3

से कहीं भी उपयोग किया जा सकता है यह काम नहीं करेगा, क्योंकि 'कुछ निजी प्रॉपर्टी' सभी मामलों में साझा की जाएगी। –

0

एक छोटे चाल के साथ संभव है:

var obj = Em.Em.Object.create(
    new function(){ 
     var privateVar = "this is private"; 
     this.getPrivateVar = function(){ 
      return privateVar ; 
     } 
    }, 
    { 
     emberVar: "Ember var", 
     emberMethod : function(){ 
      return this.getPrivateVar(); 
     }, 
     emberMethod1 : function(){ 
      return privateVar ; 
     }, 
     emberBinding : 'emberVar' 
    } 
) 
अब

अगर यू private वर

obj.privateVar 
> unknown 

obj.getPrivateVar() 
> "this is private" 

obj.emberMethod() 
> "this is private" 

प्राप्त करने के लिए केवल एक समस्या यह है की कोशिश कि:

obj.emberMethod1() 
> unknown 
+1

यह काम नहीं करता है, क्योंकि 'निजी वार' सभी मामलों में साझा किया जाएगा। –

7

वहाँ वास्तव में, एंबर वस्तुओं में निजी चर राशि के लिए एक रास्ता है इस प्रकार है:

MyObject = Ember.Object.extend({ 
    init: function() { 
    // private variable 
    var a = 1; 

    // methods to get, set, or otherwise accesss the private variables 
    this.getA = function() {return a;}; 
    this.setA = function(val) {a = val;} 

    // don't forget this! 
    this._super(...arguments); 
    } 
}); 

अब कोशिश

o1 = MyObject.create() 
o2 = MyObject.create() 
o1.setA(42); 
o2.getA(); //1 

दूसरे शब्दों में, आप निजी चर घोषित करने के लिए है, और किसी भी गेटर्स, सेटर्स, या अन्य दिनचर्या जो उन्हें उपयोग करना चाहते हैं, init हुक में। बेशक, इसका मतलब है कि उन गेटर्स/सेटर्स कक्षा के प्रत्येक उदाहरण पर इसके प्रोटोटाइप की बजाय उपस्थित होंगे। यह थोड़ा अक्षम है, लेकिन जावास्क्रिप्ट में कक्षाओं के लिए निजी चर के किसी भी दृष्टिकोण के लिए यह वही है।

यह एंबर वस्तुओं पर एक नया private: {} हैश परिचय सकता है, लेकिन फिर एंबर मशीनरी का एक बहुत जरूरत है खोजने और वर्ग पदानुक्रम भर में निजी चर के लिए उपयोग को नियंत्रित करने को संभालने के लिए होगा बोधगम्य है। यह भाषा को फिर से डिजाइन या विस्तारित करने के बराबर होगा, जो एम्बर मिशन का हिस्सा नहीं है।

इस बीच, उपर्युक्त दृष्टिकोण ठीक काम करता है यदि निजी आवृत्ति चर की संख्या सीमित है और उन तक पहुंचने की आवश्यकता वाले दिनचर्या की संख्या छोटी है। तो स्वीकार किया गया जवाब जो कहता है असंभव है, ठीक है, गलत है।

+1

इसे वोट दिया जाना चाहिए क्योंकि यह सही उत्तर है, और अभी भी एम्बर 2.0 के रूप में प्रासंगिक है – Vassi

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