設計模式與開發實踐之單例模式
阿新 • • 發佈:2019-04-11
思想
- 確保只有一個例項
- 提供全域性訪問
這麼看來在全域性環境下
var a = {};
這種形式就滿足以上兩條,但是全域性變數不是單例模式
代理實現單例模式
- 代理的作用是實現一個例項的邏輯
var createPop = function (html) { this.html = html; this.createDom(); } // 原型上掛載共享屬性和共享的方法 createPop.prototype.createDom = function () { var pop = document.createElement('div'); pop.innnerHTML = this.html; document.body.appendChild(pop); } var createSingle = (function () { var instance; return function (html) { if(!instance) { instance = new createPop(html); } return instance; } })() var pop0 = new createSingle('pop0'); // 這裡new的是createSingle裡面的返回的匿名函式,返回的引用型別的資料(注意) var pop1 = new createSingle('pop1'); pop0 === pop1 // true
惰性單例,顧名思義就是在我們需要的時候在去建立這個單例
- 將建立物件和管理單例的邏輯分離開來,還是就上面的例子
// 業務邏輯 var createDom = function () { var pop = document.createElement('div'); pop.innnerHTML = this.html; document.body.appendChild(pop); this.name = '測試' return true; } // 保證只有一個例項 var createSingle = (function () { var instace; return function (fn) { console.log(this); // 這個匿名被誰掉用,就指向誰,可以將createDom中的一些屬性繫結到呼叫的物件上 // 這裡就將createDom的name屬性掛載到window上 return instace|| (instace = fn.call(this, arguments)) } })() createSingle(createDom);