最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年02月14日 15:47:15   投稿:lqh  
這篇文章主要介紹了javascript 單例模式詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下

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();       //single
console.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();       //single
console.log(a === b);  //true

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

 上面的例子用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í)例化一個(gè)單例。

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

相關(guān)文章

最新評(píng)論

永济市| 嘉义市| 阿鲁科尔沁旗| 漳平市| 会宁县| 鹤山市| 神木县| 萨迦县| 灌阳县| 荥阳市| 青浦区| 涡阳县| 获嘉县| 瑞昌市| 威宁| 东阿县| 贡觉县| 卓资县| 姚安县| 千阳县| 松阳县| 河源市| 达孜县| 邹城市| 土默特左旗| 红原县| 徐闻县| 景泰县| 临泽县| 镇原县| 扶风县| 如东县| 越西县| 蓝田县| 噶尔县| 祁门县| 长乐市| 衢州市| 基隆市| 盖州市| 泾川县|