2013-11-01 9 views
5

मैं वर्तमान में जावास्क्रिप्ट में कक्षाओं के निर्माण के लिए विभिन्न पैटर्न देख रहा हूं। लेकिन कोई मैटर नहीं, मैं कौन सा पैटर्न देखता हूं, अभी भी कुछ चीजें हैं जिनके बारे में मुझे वास्तव में यकीन नहीं है।जावास्क्रिप्ट क्लास बेस्ट प्रैक्टिस?

var ItemManager = (function() 
{ 
    var p = function() 
    { 
     this.items= []; 
    }; 

    p.prototype.addItem = function(item) 
    { 
     var self = this;  
     self.items.push(item); 
    }; 

    return p; 
}()); 

मैं साधारण क्लास ItemManager बनाने के लिए, इस वर्ग के संग्रह के लिए किसी भी आइटम को जोड़ने के लिए addItem समारोह मिला है। अब मैं वास्तव में वैरिएबल आइटम नहीं चाहता, जो संग्रह का प्रतिनिधित्व करता है, सार्वजनिक होने के लिए, यह चर निजी होना चाहिए, लेकिन मुझे निजी चरों तक पहुंचने के लिए प्रोटोटाइप विधि का उपयोग करने का कोई भी संभावित तरीका नहीं दिख रहा है।

तो इस मामले में सबसे अच्छा अभ्यास क्या है? बस निजी चर का उपयोग न करें?

+4

जेएस कॉल – rlemon

+0

में कोई कक्षा नहीं है http://stackoverflow.com/q/436120/1117720 –

उत्तर

-1

रूप GoldenerAal उल्लेख किया है, वे कहा जाता है नहीं कर रहे हैं कक्षाएं, लेकिन कार्यों आप

var ItemManager = function(){ 
.. 
... 
... 

}; 

है तुम हो सकता है:

function ItemManager(){ 
this.items = []; 

function addItem(item){ 
... 
}; 
}; 

आप तो ItemManager का एक उदाहरण बना सकते हैं, केवल जब आप की जरूरत है प्रति:

var itemManager = new ItemManager(); 
itemManager.addItem(<something here>); 

http://javascript.crockford.com/private.html फ़ंक्शन के अंदर चर केवल उस फ़ंक्शन का दायरा है, वह चर वैश्विक चर (स्थैतिक चर) नहीं है।

6
var ItemManager = function() { 
    var items = []; 

    return { 
      addItem : function(item) { 
       items.push(item); 
      }, 
      removeItem : function() { 
       return items.pop(); 
      } 
    } 
}; 

var myItemManager = new ItemManager(); 

items चर ItemManager समारोह के निष्पादन के बाद पीछे छिप जाता है, लेकिन addItem और removeItem अभी भी items की पहुंच साझा। आगे की जांच के लिए जावास्क्रिप्ट में निजी चर पर Douglas Crockford's article देखें।

+1

यह काम करता है, लेकिन 'exampleof' चेक विफल हो जाएगा: http://ideone.com/b9hgi4 – Passerby

+0

उपर्युक्त टिप्पणी के अतिरिक्त: यह प्रत्येक अलग ऑब्जेक्ट के लिए अनाम कार्यों ('addItem' और 'removeItem' गुणों को असाइन किया गया) का एक नया सेट बनाएगा। – zerkms

+0

@Passerby हाँ, मैं इसे देखता हूं ... मैं यह जानने का प्रयास करूंगा कि क्यों। आपके कमेंट के लिए धन्यवाद। – aga

0

several ways निजी चर के लिए कर रहे हैं: आगा के उदाहरण के रूप में

  • बंद किया जाना, है, जो Revealing Module Pattern उपयोग करता है। यदि आप ES6 कक्षाओं का उपयोग कर रहे हैं, तो आप hide private data in the constructor कर सकते हैं, हालांकि यह मेरे लिए बहुत बदसूरत लग रहा है।
  • [ES6] चिह्न
  • [ES6],

मैं प्रतीक के पक्ष WeakMap हालांकि वे अभी भी प्रतिबिंब है (यानी पूरी तरह से निजी नहीं) का उपयोग कर पाया जा सकता है। उदाहरण:

var Person = (function() { 
    var nameSymbol = Symbol('name'); 
​ 
    function Person(name) { 
     this[nameSymbol] = name; 
    } 
​ 
    Person.prototype.getName = function() { 
     return this[nameSymbol]; 
    }; 
​ 
    return Person; 
}()); 

तो यह (यथोचित) निजी चर करना संभव है, लेकिन समाधान के दुर्भाग्य से कोई भी रूप में सुंदर चाहें, उतनी बार कर रहे हैं।

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