2012-04-28 53 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