思想
這麼看來在全局環境下
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);