My Little World

单例模式

单例模式定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点

主要思想<通用惰性单例>
管理单例逻辑(保证实现单例的过程)和创建过程(具体业务逻辑)分开,创建过程函数作为参数给到管理单例逻辑函数中,
通过调用单例逻辑函数,业务逻辑函数只执行一次

用途
1.创建单一对象
2.利用业务逻辑仅执行一次,进行事件挂载

注意事项
业务逻辑函数一定要return 一个真正

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
var getSingle = function(fn){
var ret;
return function(){
return ret || (ret = fn.apply(this,arguments));
//第一次执行时,会运行函数,返回创建的实例给到ret,
//以后再执行时,ret 即第一次创建的实例直接返回
}
}

//返回单例
var creatObj = function(name){
this.aaaa = {
name:name,
getName:function(){console.log(this)}
}
return this
}
var creatObj1 = getSingle(creatObj)
var obj = creatObj1('aaa')
console.log(obj) //返回window 对象(满足全局可访问),带有aaaa属性,值为字面量对象
obj.aaaa.getName()//{name: "kitty", getName: ƒ}

var obj1 = creatObj1('aaa')
console.log(obj=== obj1) //true

obj1.aaaa.getName() //{name: "kitty", getName: ƒ}

//事件仅挂载一次

var bindEvent = getSingle(function(){
document.getElementById('div1').onclick = function(){
console.log('click')
}
return true //保证只执行一次
})

var render = function(){
console.log('开始渲染');
bindEvent()
}

render()
render()
render()
//渲染多次,div1只挂载一次事件