轻松掌握JavaScript单例模式
定义:保证一个对象(类)仅有一个实例,并提供一个访问它的全局访问点;
实现原理:利用闭包来保持对一个局部变量的引用,这个变量保存着首次创建的唯一的实例;
主要用于:全局缓存、登录浮窗等只需要唯一一个实例的时候;
一.为一个非单例模式对象(如:Demo)实现单例模式的方法:
给Demo添加一个静态方法来实现单例:
Demo.getSingle=(function(){ vardemo=null; returnfunction(name){ if(!demo){ demo=newDemo(name); } returndemo; } })();
用法:
非单例模式:vara=newDemo('Peter');
单例模式:
varb1=Demo.getSingle('Peter'); varb2=Demo.getSingle('Sufei'); b1===b2;//true,都引用的是newDemo('Peter')
通过代理类来实现单例:
varProxyDemo=(function(){ vardemo=null; returnfunction(name){ if(!demo){ demo=newDemo(name); } returndemo; } })();
用法:
非单例模式:vara=newDemo('Peter');
单例模式:varb=newProxyDemo('Peter');
二.惰性单例模式:只在需要的时候才创建该单例;
以下是通用惰性单例的创建方法:
vargetSingle=function(foo){ varsingle=null; returnfunction(){ returnsingle||(single=foo.apply(this,arguments)); } };
用法:
varcreateLoginLayer=function(){ varfrag=document.createDocumentFragment(); vardiv=document.createElement('div'); div.style.display='none'; //以下给div添加其它登录元素 ... document.body.appendChild(frag.appendChild(div)); returndiv; } varcreateSingleLoginLayer=getSingle(createLoginLayer); //当用户第一次点击按钮(id='lgBtn')时,来创建并显示登录窗口,之后重复点击按钮不会重复创建; document.getElementById('lgBtn').onclick=function(){ varlg=createSingleLoginLayer(); lg.style.display='block'; }
附:缓存函数的计算结果,如计算一个数的数列
以下是不缓存的写法,非常慢!
functionfoo(n){ results=n<2?n:foo(n-1)+foo(n-2); returnresults; } console.log(foo(40));//得计算好几秒
以下是缓存写法,基本瞬间出结果!
varcache={}; functionfoo(n){ if(!cache[n]){ cache[n]=n<2?n:foo(n-1)+foo(n-2); } returncache[n]; } console.log(foo(100));
更好的写法:
varfoo=(function(){ varcache={}; returnfunction(n){ if(!cache[n]){ cache[n]=n<2?n:foo(n-1)+foo(n-2); } returncache[n]; }; })(); console.log(foo(100));
参考文献:
《JavaScript模式》
《JavaScript设计模式与开发实践》
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。