2012-04-28 20 views
5

czytałem ten link http://addyosmani.com/largescalejavascript/#modpatternenkapsulacji w javascript moduł wzór

I zobaczyłem następujący przykład.

var basketModule = (function() { 
var basket = []; //private 

return { //exposed to public 
     addItem: function(values) { 
      basket.push(values); 
     }, 
     getItemCount: function() { 
      return basket.length; 
     }, 
     getTotal: function(){ 
      var q = this.getItemCount(),p=0; 
      while(q--){ 
       p+= basket[q].price; 
      } 
     return p; 
     } 
     } 
}()); 

basketModule.addItem({item:'bread',price:0.5}); 
basketModule.addItem({item:'butter',price:0.3}); 

console.log(basketModule.getItemCount()); 
console.log(basketModule.getTotal()); 

Statystyki To, że „wzorzec moduł to popularna konstrukcja że wzór, który obudowuje«prywatność», państwa i organizacji za pomocą zamknięć” Jak się to różni od pisania go jak poniżej? Czy prywatność nie może być po prostu egzekwowana za pomocą zakresu funkcji?

var basketModule = function() { 
var basket = []; //private 
     this.addItem = function(values) { 
      basket.push(values); 
     } 
     this.getItemCount = function() { 
      return basket.length; 
     } 
     this.getTotal = function(){ 
      var q = this.getItemCount(),p=0; 
      while(q--){ 
       p+= basket[q].price; 
      } 
     return p; 
     } 

} 

var basket = new basketModule(); 

basket.addItem({item:'bread',price:0.5}); 
basket.addItem({item:'butter',price:0.3}); 

Odpowiedz

3

W pierwszym wariancie tworzysz obiekt bez możliwości tworzenia jego nowych instancji (jest to natychmiastowa instancja). Drugi przykład to pełna funkcja contructor, pozwalająca na kilka instancji. Enkapsulacja jest taka sama w obu przykładach, tablica basket jest "prywatna" w obu.

Just for Fun: najlepsze z obu światów mogą być:

var basketModule = (function() { 
    function Basket(){ 
     var basket = []; //private 
     this.addItem = function(values) { 
      basket.push(values); 
     } 
     this.getItemCount = function() { 
      return basket.length; 
     } 
     this.getTotal = function(){ 
      var q = this.getItemCount(),p=0; 
      while(q--){ 
       p+= basket[q].price; 
      } 
     return p; 
     } 
    } 
    return { 
    basket: function(){return new Basket;} 
    } 
}()); 
//usage 
var basket1 = basketModule.basket(), 
    basket2 = basketModule.basket(), 
+0

Chyba moje pytanie jest teraz to pierwszy wzór bardziej „moduł” niż sekundę. Łącze wykorzystuje pierwszy wariant jako wyraźny przykład wzorca modułu. – eirikrl

+0

Powiedziałbym, że pierwszy wariant odzwierciedla wzór modułu (dostarczając 'basketModule'), drugi zapewnia sposób tworzenia instancji' basket' ​​*. To wszystko kwestia etykietowania po drodze, możesz nazwać pierwszy wariant także "wzorem singleton". – KooiInc

+0

Z punktu widzenia, że ​​moduł jest odizolowanym pakietem funkcjonalności, a nie zestawem klas natychmiastowych, to tak. Jednak różnica między nimi nie polega na tyle, by projektować, ale na składni. Nic nie stoi na przeszkodzie, aby singleton był drugi, mając 'var basketModule = new function() {...};'. Pomysł użycia obiektu zwracającego polega na tym, że możesz skondensować interfejs na kilka linii kodu, jeśli wolisz, abyś mógł go zobaczyć na pierwszy rzut oka. Ale nie używałbyś do tego dużych anonimowych funkcji, wystarczyłoby 'return {publicFunc: privateFunc};'. –