javascript 單例模式詳解及簡單實(shí)例
JS 單例模式
概要:
單例指一個類只有一個實(shí)例,這個類自行創(chuàng)建這個實(shí)例。
利用對象字面量直接生成一個單例:
var singleton = {
prop: 1,
method: function(){
console.log(a); //1
}
}
嚴(yán)格的說對象字面量可能不算單例模式,生成單例是對象字面量的作用(已經(jīng)被封裝),而單例模式是一個設(shè)計(jì)模式(需要自行構(gòu)思或設(shè)計(jì))。
在類內(nèi)部用new生成實(shí)例的單例模式:
var instance;
var foo = function(){
if(!instance){
instance = new Singleton();
}
return instance;
function Singleton(){
this.name = 'single';
this.method = function(){
console.log(this.name);
}
};
}
var a = foo();
var b = foo();
a.method(); //single
console.log(a === b); //true
單例模式只要檢測一個實(shí)例是否被生成。假如沒有實(shí)例,則生成實(shí)例。假如已經(jīng)生成則返回這個實(shí)例。保證這個類只有這一個實(shí)例。
由于hoisting,函數(shù)會提前聲明,所以 singleton 函數(shù)放在哪都沒所謂,但是每次調(diào)用都會聲明函數(shù)singleton,可能會不夠優(yōu)雅。
由于new關(guān)鍵字是執(zhí)行函數(shù),同時this指向這個對象,所以可以判斷類的this是否賦值給instance:
var instance;
var Singleton = function(){
if(instance){
return instance;
}
instance = this;
this.name = 'single';
this.method = function(){
console.log(this.name);
}
}
var a = new Singleton();
var b = new Singleton();
a.method(); //single
console.log(a === b); //true
這個例子中,把instance指向了Singleton這個類,然后在類外部通過new來實(shí)例化,和上例中的new異曲同工。由于是通過修改this來達(dá)到檢測是否執(zhí)行過Singleton類,所以個人感覺不夠語義化。
上面的例子用es6重構(gòu)的寫法。
類內(nèi)部new生成單例:
var instance;
class foo{
static Singleton(){
if(!instance){
instance = new foo();
}
return instance;
}
method(){
this.name = 'single';
console.log(this.name);
}
}
var a = foo.Singleton();
var b = foo.Singleton();
a.method(); //single
console.log(a === b); //true
修改this指向生成單例:
var instance;
class foo{
constructor(){
if(!instance){
this.Singleton();
}
return instance;
}
Singleton(){
instance = this;
this.name = 'single';
this.method = function(){
console.log(this.name);
}
}
}
var a = new foo();
var b = new foo();
a.method(); //single
console.log(a === b); //true
當(dāng)然除了這兩種以外還有別的方式能實(shí)例化一個單例。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- JavaScript設(shè)計(jì)模式---單例模式詳解【四種基本形式】
- JS 設(shè)計(jì)模式之:單例模式定義與實(shí)現(xiàn)方法淺析
- javascript設(shè)計(jì)模式 – 單例模式原理與應(yīng)用實(shí)例分析
- 原生javascript單例模式的應(yīng)用實(shí)例分析
- 基于JavaScript實(shí)現(xiàn)單例模式
- js設(shè)計(jì)模式之單例模式原理與用法詳解
- JavaScript設(shè)計(jì)模式之單例模式原理與用法實(shí)例分析
- JavaScript設(shè)計(jì)模式之單例模式簡單實(shí)例教程
- JavaScript實(shí)現(xiàn)單例模式實(shí)例分享
- NodeJS設(shè)計(jì)模式總結(jié)【單例模式,適配器模式,裝飾模式,觀察者模式】
- JavaScript設(shè)計(jì)模式之單例模式詳解
- 解析Javascript單例模式概念與實(shí)例
- 怎樣用Javascript實(shí)現(xiàn)單例模式
相關(guān)文章
js客戶端快捷鍵管理類的較完整實(shí)現(xiàn)和應(yīng)用
js客戶端快捷鍵管理類的較完整實(shí)現(xiàn)和應(yīng)用,需要的朋友可以參考下。2010-06-06
解決typescript項(xiàng)目報錯:找不到模塊“xxx”或其相應(yīng)的類型聲明問題
這篇文章主要介紹了解決typescript項(xiàng)目報錯:找不到模塊“xxx”或其相應(yīng)的類型聲明問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
JS+CSS實(shí)現(xiàn)下拉列表框美化效果(3款)
這篇文章主要介紹了JS+CSS實(shí)現(xiàn)美化的下拉列表框效果,涉及javascript針對下拉列表框樣式的相關(guān)操作技巧,三款下拉菜單簡單大方,需要的朋友可以參考下2015-08-08
js中關(guān)于String對象的replace使用詳解
關(guān)于String對象的replace使用詳解,需要的朋友可以參考下。2011-05-05
JavaScript中的6種變體函數(shù)的區(qū)別和應(yīng)用
JavaScript?中函數(shù)調(diào)用有許多獨(dú)特的變體方式,例如?~function、-function?等,這些變體不僅展現(xiàn)了?JavaScript?語言的靈活性,也可以在某些場景下讓代碼更加簡潔,本文將通過示例代碼和解析,來全面剖析這些特殊的函數(shù)調(diào)用方式及其返回值的區(qū)別2025-01-01

