单例模式:单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否。如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只能有一个实例对象。在js中,单例作为一个命名空间的提供者,从全局空间里面提供一个唯一的访问点来访问该对象。
解释:如一个新房子,若无门,要通知建筑商建门;如果有门,进入即可;
单例模式主要功能之一是要保护对象,就像一个屋子的们是要保护家人一样;
单例模式的作用:
1)模块间的通信;
含义:有两个屋子,301住着小王,302住着小李;他们相当于两个独立的模块;如果两个模块之间想要通信,有三种方法:a、通过门铃通信;b、两人走到门外;c、通过电话。注意前提,两者都是独立模块,被封在自己的家里面;
例子:
var a=4;
a = 5;//这就造成了a的污染
//想把a变量保护起来的方法是:给变量加个命名空间;这样变量之间不会互相污染
var x,y;
x.a=4;
y.a=5;
2)系统中某个类的对象只能存在一个;
含义:一个家只能有一个对外敞开门,同时这个门也只能对应一个家;
3)保护自己的属性和方法
含义:防止外面的人进入家里面;保护家里的各种东西和家人不受外人干扰。
单例模式的注意事项:
1)注意this的使用;
JavaScript的this特别灵活,不像其他编程语言中,只有一个this,代表当前的对象;而js中的this,随着调用不断的变化,也就是谁掉我,我指向谁:window调我,我指向window;object调我,我指向object;
2)闭包容易造成内存泄漏,不需要的赶快干掉。
闭包就是拿到了我本不该拿到的东西,把外面不该拿的东西,return出来;
3)注意new的成本;
var a;我们可以用此声明一个string类型变量;
var a = newString();这个语句就增加了声明该变量的后台成本,应该有节制的使用。
单例模式的代码:
伪代码:
1、建立两个独立的对象,一个xiaowang,一个xiaoli
2、让xiaowang和xiaoli通过门铃进行通信;
3、通信的前提是:先看xiaowang家是否有门,如果有门则直接通过门铃进行通信,如果没有们,则选择先建门;
4、两个单例模块开始进行通信;
代码:
//该单例只有需要用时,才会new一个门;
var xiaoming = (function(argument){
var xiaomingjia=function(message){
this.menling=message;
}
var door;
var info={
sendMessage:function(message){
if(!door){
door=new xiaomingjia(message);
}
return door;
}
};
return info;
})();
//此单例是静态的,会长贮到内容中;
var xiaoli={
callXiaowang:function(msg){
var _xw=xiaowang.sendMessage(msg);
alert(_xw.menling);
_xw=null;//用完了就要置空,等待垃圾回收。
}
}
//两个实例通信
xiaoli.callXiaowang('didi');
var top={
init:function(){
this.render();
this.bind();
},
a:4,
render:function(){
var me=this;
me.btna=$('#a');//一个页面上的按钮
},
bind:function(){
var me=this;
me.btna.click(function(){
//业务逻辑拿出来
me.test();
})
},
test:function(){
a=5;
}
}
var banner={
init:function(){
this.render();
this.bind();
},
a:4,
render:function(){
var me=this;
me.btnd=$("#d");
},
bind:function(){
var me=this;
me.btnd.click(function(){
//业务
me.test();
})
},
test:function(){
top.a=6;//改变top作用域下的a
}
}
top.init();
banner.init();