国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

javascript 單例模式詳解及簡(jiǎn)單實(shí)例

2019-11-19 17:35:09
字體:
供稿:網(wǎng)友

JS 單例模式

概要:

單例指一個(gè)類只有一個(gè)實(shí)例,這個(gè)類自行創(chuàng)建這個(gè)實(shí)例。

利用對(duì)象字面量直接生成一個(gè)單例:

var singleton = {  prop: 1,  method: function(){    console.log(a);  //1  }}

嚴(yán)格的說對(duì)象字面量可能不算單例模式,生成單例是對(duì)象字面量的作用(已經(jīng)被封裝),而單例模式是一個(gè)設(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();       //singleconsole.log(a === b);  //true

單例模式只要檢測(cè)一個(gè)實(shí)例是否被生成。假如沒有實(shí)例,則生成實(shí)例。假如已經(jīng)生成則返回這個(gè)實(shí)例。保證這個(gè)類只有這一個(gè)實(shí)例。

由于hoisting,函數(shù)會(huì)提前聲明,所以 singleton 函數(shù)放在哪都沒所謂,但是每次調(diào)用都會(huì)聲明函數(shù)singleton,可能會(huì)不夠優(yōu)雅。

由于new關(guān)鍵字是執(zhí)行函數(shù),同時(shí)this指向這個(gè)對(duì)象,所以可以判斷類的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();       //singleconsole.log(a === b);  //true

這個(gè)例子中,把instance指向了Singleton這個(gè)類,然后在類外部通過new來實(shí)例化,和上例中的new異曲同工。由于是通過修改this來達(dá)到檢測(cè)是否執(zhí)行過Singleton類,所以個(gè)人感覺不夠語義化。

 上面的例子用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();       //singleconsole.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();       //singleconsole.log(a === b);  //true  

當(dāng)然除了這兩種以外還有別的方式能實(shí)例化一個(gè)單例。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 北流市| 新源县| 财经| 龙陵县| 庄浪县| 淮阳县| 永昌县| 青铜峡市| 勐海县| 漳浦县| 莆田市| 潜江市| 达孜县| 壶关县| 钟山县| 隆尧县| 武乡县| 阳西县| 昌宁县| 茂名市| 平度市| 高邑县| 深圳市| 青岛市| 武穴市| 社会| 繁峙县| 莱阳市| 大洼县| 庆安县| 枣庄市| 娱乐| 丹凤县| 万山特区| 贵州省| 瑞昌市| 江川县| 东丽区| 德清县| 浦北县| 长丰县|