适用于弹框的实现, 全局缓存
const singleton = function(name) {this.name = namethis.instance = null}singleton.prototype.getName = function() {console.log(this.name)}singleton.getInstance = function(name) {if (!this.instance) { // 关键语句this.instance = new singleton(name)}return this.instance}// testconst a = singleton.getInstance('a') // 通过 getInstance 来获取实例const b = singleton.getInstance('b')console.log(a === b)
因为 JavaScript 是无类的语言, 而且 JS 中的全局对象符合单例模式两个条件。很多时候我们把全局对象当成单例模式来使用,
var obj = {}
实现弹框的一种做法是先创建好弹框, 然后使之隐藏, 这样子的话会浪费部分不必要的 DOM 开销, 我们可以在需要弹框的时候再进行创建, 同时结合单例模式实现只有一个实例, 从而节省部分 DOM 开销。下列为登入框部分代码:
const createLoginLayer = function() {const div = document.createElement('div')div.innerHTML = '登入浮框'div.style.display = 'none'document.body.appendChild(div)return div}
使用单例模式将创建弹框代码解耦, 代码如下:
const getSingle = function(fn) {let resultreturn function() {return result || (result = fn.apply(this, arguments))}}
const createSingleLoginLayer = getSingle(createLoginLayer)document.getElementById('loginBtn').onclick = function() {createSingleLoginLayer()}