單例指乙個類只有乙個例項,這個類自行建立這個例項。
利用物件字面量直接生成乙個單例:
var singleton =}
嚴格的說物件字面量可能不算單例模式,生成單例是物件字面量的作用(已經被封裝),而單例模式是乙個設計模式(需要自行構思或設計)。
在類內部用new生成例項的單例模式:
var instance;var foo = function()
return instance;
function singleton()
};}var a = foo();
var b = foo();
a.method(); //single
console.log(a === b); //true
單例模式只要檢測乙個例項是否被生成。假如沒有例項,則生成例項。假如已經生成則返回這個例項。保證這個類只有這乙個例項。
由於hoisting,函式會提前宣告,所以 singleton 函式放在哪都沒所謂,但是每次呼叫都會宣告函式singleton,可能會不夠優雅。
由於new關鍵字是執行函式,同時this指向這個物件,所以可以判斷類的this是否賦值給instance:
var instance;var singleton = function()
instance = this;
this.name = 'single';
this.method = function()
}var a = new singleton();
var b = new singleton();
a.method(); //single
console.log(a === b); //true
這個例子中,把instance指向了singleton這個類,然後在類外部通過new來例項化,和上例中的new異曲同工。由於是通過修改this來達到檢測是否執行過singleton類,所以個人感覺不夠語義化。
上面的例子用es6重構的寫法。
類內部new生成單例:
var instance;class foo
return instance;
}
method()
}var a = foo.singleton();
var b = foo.singleton();
a.method(); //single
console.log(a === b); //true
修改this指向生成單例:
var instance;class foo
return instance;
}singleton()
}}var a = new foo();
var b = new foo();
a.method(); //single
console.log(a === b); //true
當然除了這兩種以外還有別的方式能例項化乙個單例。
js單例模式
今天進一步了解了js單例模式,下面說一下我的理解。在實際問題中,我們在js檔案中宣告過多的函式和全域性變數,或者匯入多個js檔案,都可能導致全域性變數的命名衝突問題。單例模式要求類只能例項化一次並且提供例項的全域性介面。通過單例模式,我們可以為某些方法和屬性規劃乙個命名空間來解決問題。比較簡單的單例...
js單例模式
1.html doctype html en utf 8 viewport content width device width,initial scale 1.0 document title form item item label item input item span style head...
JS設計模式 單例模式
單例模式是乙個用來劃分命名空間並將一批屬性和方法組織在一起的物件,如果它可以被例項化,那麼它只能被例項化一次。單例模式優點 並非所有的物件字面量都是單例,比如模擬資料基本結構 let cat 上面物件字面量結構是建立單例模式的方法之一,但並不是單例模式,單例模式的特點是僅被例項化一次 要實現單例模式...