js设计模式之单例模式
发布时间:2020-01-06 03:43

思想

确保只有一个实例

提供全局访问

这么看来在全局环境下var a = {};这种形式就满足以上两条,但是全局变量不是单例模式

代理实现单例模式

代理的作用是实现一个实例的逻辑

var createPop = function (html) { this.html = html; this.createDom();}// 原型上挂载共享属性和共享的方法createPop.prototype.createDom = function () { var pop = document.createElement('div'); pop.innnerHTML = this.html; document.body.appendChild(pop);}var createSingle = (function () { var instance; return function (html) { if(!instance) { instance = new createPop(html); } return instance; }})()var pop0 = new createSingle('pop0'); // 这里new的是createSingle里面的返回的匿名函数,返回的引用类型的数据var pop1 = new createSingle('pop1');pop0 === pop1 // true

惰性单例

顾名思义就是在我们需要的时候在去创建这个单例,将创建对象和管理单例的逻辑分离开来,还是就上面的例子

// 业务逻辑var createDom = function () { var pop = document.createElement('div'); pop.innnerHTML = this.html; document.body.appendChild(pop); this.name = '测试' return true;}// 保证只有一个实例var createSingle = (function () { var instace; return function (fn) { console.log(this); // 这个匿名被谁掉用,就指向谁,可以将createDom中的一些属性绑定到调用的对象上 // 这里就将createDom的name属性挂载到window上 return instace|| (instace = fn.call(this, arguments)) }})()createSingle(createDom);
下一篇:没有了