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});
我想我的问题是现在的第一图案更“模块”不是第二个。链接使用第一个变体作为模块模式的明确示例。 – eirikrl 2012-04-28 11:24:42
我会说第一个变体反映模块模式(提供'basketModule'),第二个提供了创建'basket' *实例*的方法。这一切都是顺便贴上标签的问题,您可以将第一个变体命名为“单身模式”。 – KooiInc 2012-04-28 11:37:01
从一个模块是一个独立的功能包而不是一组实例化类的角度来看,是的。然而,两者的区别并不在于设计,而在于语法。没有什么能够阻止你通过使用'var basketModule = new function(){...};'来实现第二种方式。使用返回对象的想法是,如果您愿意,可以将界面压缩成几行代码,以便您一眼就能看到它。但是你不会为此使用大的匿名函数,你只需要'return {publicFunc:privateFunc};'。当谈到新的关键字 – 2012-04-28 11:41:32