轻松掌握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设计模式与开发实践》
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。