定义:一个类仅有一个实例,并提供一个访问它的全局访问点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