一、Module模式
最初被定义为一种在传统软件工程中为类提供私有和公有封装的方法。
在js中,Module模式用于进一步模拟类的概念,通过这种方式,能够使一个单独的对象用于公有/私有方法和变量,从而屏蔽来自全局作用域的特殊部分。产生的结果是:函数名与在页面上其他脚本定义的函数冲突的可能性降低。
var myNamespace=(function(){
//私有计数器变量
var myPrivateVar=0;
//记录所有参数的私有函数
var myPrivateMethod=function(foo){
console.log(foo);
}
return{
//公有变量
myPublicVar:"foo",
//调用私有变量和方法的公有函数
myPublicFunction:function(bar){
//增加私有计数器值
myPrivateVar++;
//传入bar调用私有方法
myPrivateMethod(bar);
}
};
})();
二、私有
Module模式使用闭包封装“私有”状态和组织。它提供了一种包装混合公有/私有方法和变量的方式,防止其泄露至全局作用域,并与别的开发人员的接口发生冲突。通过该模式,只需返回一个公有API,而其他的一切则都维持在私有闭包里 。
var basketModule=(function(){
//私有
var basket=[];
function doSomethingPrivate(){
console.log("private");
}
function doSomethingElsePrivate(){
//
}
//返回一个暴露出的公有对象
return{
//添加item到购物车
addItem:function(values){
basket.push(values);
},
//获取购物车里的item数
getItemCount:function(){
return basket.length;
},
//私有函数的公有形式别名,
// doSomething:doSomethingPrivate自动调用doSomethingPrivate函数
doSomething:doSomethingPrivate,
//获取购物车里所有item的价格总值
getTotal:function(){
var itemCount=this.getItemCount(),total=0;
while(itemCount--){
total+=basket[itemCount].price;
}
return total;
}
};
})();
//basketModule返回了一个拥有公用API的对象
basketModule.addItem({
item:"bread",
price: 0.5
});
basketModule.addItem({
item:"butter",
price:0.3
});
console.log(basketModule.getItemCount());
console.log(basketModule.getTotal());
//会打印一个private和一个undefined,原因不明
console.log(basketModule.doSomething());
console.log(basketModule.basket);