定義:一個類僅有一個實例,並提供一個訪問它的全局訪問點html
實現思路:經過一個變量判斷是否已經建立過對象了,若是是,直接返回此變量。app
1 /** 2 * 單例模式基礎實現 3 * 缺點:沒有透明化 4 * @param {String} name 5 */ 6 var Singleton = function (name) { 7 this.name = name 8 } 9 10 Singleton.prototype.getName = function () { 11 console.log(this.name) 12 } 13 14 Singleton.getInstance = function (name) { 15 var instance = null 16 return function (name) { 17 if (!instance) { 18 instance = new Singleton(name) 19 } 20 return instance 21 } 22 } 23 24 var a = Singleton.getInstance('test1')
var CreateDiv = function (html) { this.html = html this.init() } CreateDiv.prototype.init = function () { var div = document.createElement('div') div.innerHTML = this.html document.body.appendChild(div) } // 使用代理實現單例模式 var ProxySingletonCreateDiv = (function () { var instance return function (html) { if (!instance) { instance = new CreateDiv(html) } return instance } })() var a = new ProxySingletonCreateDiv('test1')
在須要的時候纔會建立實例,而且只建立一個實例this
/** * * 建立對象和管理單例的職責要分開 */ var getSingle = function (fn) { var result return function () { return result || (result = fn.apply(this, arguments)) } } var createLoginLayer = function () { var div = document.createElement('div') div.innerHTML = '我是浮窗' div.style.display = 'none' document.body.appendChild(div) return div } var createSingleLoginLayer = getSingle(createLoginLayer)
參考spa