一、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);