何为单例模式
将一堆代码放入一个逻辑单元(对象),通过单一的变量来访问。
其优点是封装代码,减少全局变量。
示例
例如,要实现点击一个元素,执行某个操作的应用
原始写法:
const btn = document.querySelector('#btn')
btn.onclick = function(){render()}
function render(){/* ... */}
这样很容易出现过多全局变量,难以维护。
使用单例模式:
将应用封装为一个对象,只保留一个全局变量
const app = {
init(){
this.btn = document.querySelector('#btn')
this.bind()
},
bind(){
this.btn.onclick = ()=>{
this.render()
}
},
render(){
//...
}
}
app.init()
利用闭包:
利用闭包,隐藏变量,只暴露init
方法,这种特殊的单例模式也叫模块模式
const app = (function(){
const btn = document.querySelector('#btn')
function bind(){
btn.onclick = function(){render()}
}
function render(){/* ... */}
return {
init(){bind()}
}
})()
app.init()
【改进】不立即创建app
实例,等到需要时再创建。
const App = (function(){
let instance
function createInstance(){/* 以上app的代码 */}
return function(){
if(!instance){
instance = createInstance()
return instance
}
return instance
}
})()
const app = App()
app.init()