设计模式之单例模式(续)

       单例模式:单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否。如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只能有一个实例对象。在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();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值