单例模式
定义:一个构造函数只能生成一个实例。
应用 : 自定义弹出层
核心代码:
let instance = null
function singleton(){
if(!instance) instance = 实例对象
return instance
}
案例:
function Person(){
this.name = 'jack'
}
let instance = null
function singleton(){
if(!instance) instance = new Person()
return instance
}
const p1 = singleton()
const p2 = singleton()
console.log('单例:',p1 === p2); //true
问题:
- 书写代码的时候和 构造函数已经没有关系
- new 关键字没有了
想要实现单例模式,我们需要注意两点:
- 需要使用return。使用new的时候如果没有手动设置return,那么会默认返回this。但是,我们这里要使得每次返回的实例相同,也就是需要手动控制创建的对象,因此这里需要使用return。
- 我们需要每次return的是同一个对象。也就是说实际上在第一次实例的时候,需要把这个实例保存起来。再下一个实例的时候,直接return这个保存的实例。因此,这里需要用到闭包了。
改进代码:
let HeadClass = function () { }
let Head = (function () { //匿名自执行函数
let instance; //声明一个instance对象
return function () {
if (instance) { //如果已存在,则返回instance
return instance
}
instance = new HeadClass() //如果不存在,则new一个HeadClass对象
return instance
}
})()
let a = new Head()
let b = new Head()
console.log(a === b) //true