单例模式:一个类只有惟一的一个实例,并且提供全局访问。
一个简单的单例模式如下
//单例模式简单实现
// 单例模式就是保证一个类只有一个实例
function Single(name){
this.name=name;
if (!Single.instance) {//undefined取非为true
Single.instance=this;
}
return Single.instance
}
var my1=new Single("tom");
var my2=new Single("jack");
console.log(my1===my2)//true
// console.log(Single.instance)
惰性单例:单例模式的重点,只有需要的时候才创建实例
应用场景:曾经在项目中应用过惰性单例。大概需求是这样的:进入主页面,在不点击按钮就弹出一个图片div,点击按钮时才弹出。当时的开发过程(以前还是小白的时候)经历了以下:利用display属性做切换,点击按钮的时候设为block其他时间为none,潜在问题:
- 用户可能根本不会点击按钮,白白浪费了DOM节点
好了,我就来动态添加你不就行了吗!用的$(".box").append(..html...),又出现问题了:
- 用户点击了按钮,叮~弹出了我们的内容框,但是哎呀我不小心手抖了又点了一次???叮 ...又弹出来一个一模一样的....用户“excuse me?”
这显然是不符合需求的,好的,我再改,判断这个节点存不存在,存在的话我先remove掉再新建一个不就行了嘛!又出问题了:
- remove节点以及创建节点这样的DOM操作显然会拖慢页面加载速度影响用户体验的
好的,完美主义者一定要坚持到最后!此时就是用的我们的惰性单例模式使用的时候再创建,且只创建一次。
var createDiv=(function(){
var div;
return function(){
if (!div) {
$('.box').append(" <p id='myId'>Hello world!</p>");
div=document.getElementById("myId");
}
return div;
}
})();