单例模式
定义:一个类仅有一个实例,并提供一个访问它的全局访问点。
实际应用:全局弹窗,无论点击或关闭多少次,弹窗在页面上只会被创建一次。
如何实现:通过一个变量标识去记录当前类是否已经实例化过,创建过就直接返回,否则就直接new实例化对象。
代码举例
var createDom = (function() {
var instance = null
var create = function(params) {
if(instance) return instance
this.domContext = params
var div = document.createElement("div")
div.innerHtml = this.domContext
document.body.appendChild(div)
}
return create
})()
可以看出上述写法虽然满足且实现了单例的全局唯一性,但其中的创建对象和管理单例依然都混杂在一起,如果下次还有需要创建唯一的实例,就需要把上述方法基本原样照搬执行一次,这样显然不够灵活,也不利于扩展,这个时候就需要职责分明,做到单独创建对象和管理单例,这样才能体现出单例模式的强大。
实现方式举例
管理单例:保证唯一性
var getSingle = function(fn){
var result
return function(){
return result || ( result = fn.apply( this , arguments ))
}
}
接下来创建实例的方法将以参数的形式传入getSingle,getsingle会返回一个新的函数,并且用一个封闭的变量result来保存fn的计算结果,且因为闭包形成封闭的作用域,保证了其不会被销毁。
结合起创建dom流程实现如下
var createModal = function() {
let modal = document.createElement("div")
modal.innerHtml = '我是一个弹窗'
modal.style.display='none'
return modal
}
let modal = getSingle(createModal)
document.querySelector("#btn").onclick = function() {
let modalDom = modal()
modalDom.style.display = 'block'
}