2012-04-28 83 views
5

我讀這個鏈接http://addyosmani.com/largescalejavascript/#modpattern封裝在JavaScript模塊模式

,看到下面的例子。

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()); 

它的統計信息「模塊模式是模式封裝‘隱私’,狀態和使用閉組織流行的設計」是如何從像下面寫它這個有什麼不同?隱私不能簡單地用函數範圍強制執行?

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}); 

回答

3

在第一變,你沒有創建(它是一個立即實例化功能)的常新情況的可能性創建一個對象。第二個例子是一個完整的構造函數,允許多個實例。兩個示例中的封裝都是相同的,basket數組在兩者中都是「私有」的。

只是爲了好玩:兩全其美的可能是:

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

我想我的問題是現在的第一圖案更「模塊」不是第二個。鏈接使用第一個變體作爲模塊模式的明確示例。 – eirikrl 2012-04-28 11:24:42

+0

我會說第一個變體反映模塊模式(提供'basketModule'),第二個提供了創建'basket' *實例*的方法。這一切都是順便貼上標籤的問題,您可以將第一個變體命名爲「單身模式」。 – KooiInc 2012-04-28 11:37:01

+0

從一個模塊是一個獨立的功能包而不是一組實例化類的角度來看,是的。然而,兩者的區別並不在於設計,而在於語法。沒有什麼能夠阻止你通過使用'var basketModule = new function(){...};'來實現第二種方式。使用返回對象的想法是,如果您願意,可以將界面壓縮成幾行代碼,以便您一眼就能看到它。但是你不會爲此使用大的匿名函數,你只需要'return {publicFunc:privateFunc};'。當談到新的關鍵字 – 2012-04-28 11:41:32