一:对象自变量的方式定义模块模式
myModule={
myProperties:'pro',
myConf:{
name:'name',
age:25
},
method1:function(){
console.log('time1');
},
method2:function(){
console.log('time2');
},
method3:function(obj){
//如果当前变量是对象
if(typeof obj ==="Object"){
Myconf=obj;
}
}
}
myModule.method1();
myModule.method2();
myModule.method3({name:'sds',age:23});
模块模式被定义为一种传统软件工程中为类提供私有和公有封装的方法,进一步模拟类的概念,通过这样的方式,能够使一个单独的对象拥有共有/私有方法和变量,从而屏蔽全局作用域的特殊部分。使用闭包封装私有状态和组织。暴露一个公共的API接口,其他的一切都维持在私有闭包里。
解决方法:屏蔽处理底层事件的解决方案,暴露公共api给其他部分使用。
window.onload=function(){
//定义用模块模式定义一个购物车
var baskModule=(function(){
var bascket=[];
function dosomeThingPrivate1(){
alert("fdsa");
}
function dosomeThingPrivate2(){
alert("fdsadfs");
}
return {
//添加上平
addItem : function(item){
bascket.push(item);
},
//获取商品
getItem : function(){
return bascket.pop();
},
getTotal : function(){
return bascket.length;
},
getTotalPrice : function(){
var count=this.getTotal(),totalp=0;
//总个数大于0
while(count-->0){
totalp=totalp+bascket[count].price;
}
return totalp;
},
dosomethingpu : dosomeThingPrivate1,
};
})();
baskModule.addItem({name:'1',price:10});
baskModule.addItem({name:'2',price:20});
alert(baskModule.getTotal());
alert(baskModule.getTotalPrice());
}
优点:
1 只有我们的模块才能共享拥有私有函数的自由,因为他们不会暴露于页面的其余部分。
2函数已经声明,方便调试。
module模式作为局部块,它封装了所有的一切,那我们要怎么给module模块引入全局变量呢,这就涉及到我们的module模式的引入引出了。
//module模式的引入
var myModule=(function(JO_,_){
privatePro:'properties',
function privateMethod1(){
JQ.html('xxxxx');
},
function privateMethod2(){
},
return{
publicmethod:function(){
privateMethod1();
}
}
})(JQuery,_);
//module模式引出
var myModel=(function(){
var module={},
pripro='xxxxx',
privateMethod:function(){
`
},
module.publicPro='popop';
module.publicMethod=function(){
}
return module;
})();
module模式的优点:代码共有部分可以接触私有部分,外界无法接触私有部分。
module模式的缺点: 改边可见性时困难,无法访问之后方法添加的私有成员,无法为私有成员创建自动化单元测试。
revealing Module(揭示模式)模式
//揭示模块
var myrevarlModule=(function(){
//私有变量
var privateVar="pvar";
//公有变量
publicvar="pVar";
//私有函数
privateFun=function(){
}
publicNameFun=function(name){
this.privateVar=name;
}
//共有函数
publicFun=function(){
privateFun();
}
return {
setName:publicNameFun,
getvar:publicvar,
pubfun:publicFun
}
})();
myrevarlModule.setName('eras');
为了解决调用共有方法必须重复主对象的名称,heilman创建了一种更新的module模式,
优点:脚本一致,增强可读性。
缺点:私有函数引用共有函数,共有函数不能覆盖。