中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

JavaScript實(shí)現(xiàn)設(shè)計(jì)模式中的單例模式的一些技巧總結(jié)
來源:易賢網(wǎng) 閱讀:1045 次 日期:2016-06-27 15:57:54
溫馨提示:易賢網(wǎng)小編為您整理了“JavaScript實(shí)現(xiàn)設(shè)計(jì)模式中的單例模式的一些技巧總結(jié)”,方便廣大網(wǎng)友查閱!

單例模式是JavaScript項(xiàng)目中最常用的設(shè)計(jì)模式之一,下面羅列了JavaScript實(shí)現(xiàn)設(shè)計(jì)模式中的單例模式的一些技巧總結(jié),包括惰性加載與分支技術(shù)等,需要的朋友可以參考下.

一、使用全局變量保存單例

這是最簡單的實(shí)現(xiàn)方法

function Person(){ 

  this.createTime=new Date(); 

var instance=new Person(); 

function getInstance(){ 

  return instance; 

加載該js時(shí)就創(chuàng)建一個(gè)Person對象,保存到instance全局變量中,每次使用都取這個(gè)對象。如果一次都沒使用,那么創(chuàng)建的這個(gè)對象則浪費(fèi)了,我們可以優(yōu)化一下,

var instance 

function getInstance(){ 

  if(!instance){ 

    instance=new Person(); 

  } 

  return instance; 

這樣,第一次使用時(shí)才創(chuàng)建對象。

這個(gè)方法的缺點(diǎn)是,instance是全局的變量,在多人合作或者開發(fā)周期比較長的情況下,很難保證instance不會(huì)被其它代碼修改或覆蓋,很可能到調(diào)用的時(shí)候,發(fā)現(xiàn)instance根本就不是Person對象。

我們考慮下使用閉包來封裝起instance,使它不再是全局變量就可以解決這個(gè)問題了

二、閉包創(chuàng)建對象

var getInstance(){ 

var instance; 

return function(){ 

    if(!instance){ 

      instance=new Person(); 

    } 

    return instance; 

  } 

}(); 

這樣,instance就被封裝起來了,不用擔(dān)心被修改了。

現(xiàn)在通過getInstance()函數(shù)可以獲得單例了。新的問題,如果我通過new Person()來創(chuàng)建對象,獲得的還是多個(gè)對象,javascript又不可以像java一樣把構(gòu)造器私有化。那怎么樣可以讓多次new出來的對象都是一個(gè)實(shí)例呢?

三、構(gòu)造函數(shù)的靜態(tài)屬性緩存實(shí)例

先看代碼

function Person(){ 

  //如果已經(jīng)緩存了實(shí)例,則直接返回緩存的實(shí)例 

  if(typeof Person.instance==='object'){ 

    return Person.instance; 

  } 

  this.createTime=new Date(); 

  //緩存實(shí)例 

  Person.instance=this; 

  return this; 

從代碼可以看到,第一次new時(shí),if的條件返回false,會(huì)往下走,初始化對象,然后保存對象到Person.instance這個(gè)靜態(tài)屬性中。

第二次new 時(shí),if的條件返回true,直接返回Person.instance,不會(huì)再往下運(yùn)行初始化的代碼。所以不管new幾次,返回的都是第一次創(chuàng)建的對象。

這個(gè)方法的缺點(diǎn)和方法一的缺點(diǎn)一樣,Person.instance也是公開屬性,有可能會(huì)被修改。

我們參考方法二,使用閉包來封裝一個(gè),也許就能解決該問題了

四、重寫構(gòu)造函數(shù)

這個(gè)方法要使用閉包,但不能像方法二那么簡單,我們需要重寫構(gòu)造函數(shù)。

function Person(){ 

  //緩存實(shí)例 

  var instance=this; 

  this.createTime=new Date(); 

  //重寫構(gòu)造函數(shù) 

  Person=function(){ 

    return instance; 

  } 

第一次new 時(shí),調(diào)用原始構(gòu)造函數(shù)先緩存該實(shí)例,然后再初始化,同時(shí),重寫該構(gòu)造函數(shù)。以后再new 時(shí),永遠(yuǎn)調(diào)用不到原始的構(gòu)造函數(shù)了,只能調(diào)用到重寫后的構(gòu)造函數(shù),而這個(gè)函數(shù)總是返回緩存的instance.

上面的方法似乎沒什么問題,但通過下面的測試,可以發(fā)現(xiàn)問題

//向原型添加屬性 

Person.prototype.prop1=true; 

var p1=new Person(); 

//在創(chuàng)建初始化對象后,再次向該原型添加屬性 

Person.prototype.prop2=true; 

var p2=new Person(); 

//開始測試 

console.log(p1.prop1);//結(jié)果為true 

console.log(p2.prop1);//結(jié)果為true 

console.log(p1.prop2);//結(jié)果為undefined 

console.log(p2.prop2);//結(jié)果為undefined 

console.log(p1.constructor===Person);//結(jié)果為false 

console.log(p2.constructor===Person);//結(jié)果為false 

我們預(yù)期中的結(jié)果,應(yīng)該是全都是true。

分析一下上述測試代碼

Person.prototype.prop1=true;是在原始構(gòu)造函數(shù)的原型下增加了prop1這個(gè)屬性,并賦值

而在執(zhí)行 var p1=new Person();之后,Person這個(gè)構(gòu)造函數(shù)已經(jīng)被重寫了

所以Person.prototype.prop2=true;是在新的原型下增加prop2這個(gè)屬性

var p2=new Person(); p2和p1實(shí)際上是同一個(gè)對象,即原始構(gòu)造函數(shù)創(chuàng)建的對象

所以p1 p2都有prop1這個(gè)屬性,而沒有prop2這個(gè)屬性

同樣的,p1 p2的constructor指向的也是原始的構(gòu)造函數(shù),而Person此時(shí)已不是原來那個(gè)函數(shù)了

為了能按預(yù)期的結(jié)果那樣運(yùn)行,可以通過一些修改來實(shí)現(xiàn)

function Person(){ 

  //緩存實(shí)例 

  var instance=this; 

  //重寫構(gòu)造函數(shù) 

  Person=function(){ 

    return instance; 

  } 

  //保留原型屬性 

  Person.prototype=this; 

  //實(shí)例 

  instance=new Person(); 

  //重置構(gòu)造函數(shù)引用 

  instance.constructor=Person; 

  //其他初始化 

  instance.createTime=new Date(); 

  return instance; 

再運(yùn)行前面的測試代碼,結(jié)果都是true了。

五、惰性加載:

在大型或復(fù)雜的項(xiàng)目中,起到了優(yōu)化的作用:那些開銷較大卻很少用到的組件可以被包裝到惰性加載單例中,示例程序:

/* Singleton with Private Members, step 3. */

MyNamespace.Singleton = (function() {

 // Private members.

 var privateAttribute1 = false;

 var privateAttribute2 = [1, 2, 3];

 function privateMethod1() {

  ...

 }

 function privateMethod2(args) {

  ...

 }

 return { // Public members.

  publicAttribute1: true,

  publicAttribute2: 10,

  publicMethod1: function() {

   ...

  },

  publicMethod2: function(args) {

   ...

  }

 };

})();

/* General skeleton for a lazy loading singleton, step 1. */

MyNamespace.Singleton = (function() {

 function constructor() { // All of the normal singleton code goes here.

  // Private members.

  var privateAttribute1 = false;

  var privateAttribute2 = [1, 2, 3];

  function privateMethod1() {

   ...

  }

  function privateMethod2(args) {

   ...

  }

  return { // Public members.

   publicAttribute1: true,

   publicAttribute2: 10,

   publicMethod1: function() {

    ...

   },

   publicMethod2: function(args) {

    ...

   }

  }

 }

})();

/* General skeleton for a lazy loading singleton, step 2. */

MyNamespace.Singleton = (function() {

 function constructor() { // All of the normal singleton code goes here.

  ...

 }

 return {

  getInstance: function() {

   // Control code goes here.

  }

 }

})();

/* General skeleton for a lazy loading singleton, step 3. */

MyNamespace.Singleton = (function() {

 var uniqueInstance; // Private attribute that holds the single instance.

 function constructor() { // All of the normal singleton code goes here.

  ...

 }

 return {

  getInstance: function() {

   if(!uniqueInstance) { // Instantiate only if the instance doesn't exist.

    uniqueInstance = constructor();

   }

   return uniqueInstance;

  }

 }

})();

六、使用分支單例:

針對特定環(huán)境的代碼可以被包裝到分支型單例中,示例程序:

/* SimpleXhrFactory singleton, step 1. */

var SimpleXhrFactory = (function() {

 // The three branches.

 var standard = {

  createXhrObject: function() {

   return new XMLHttpRequest();

  }

 };

 var activeXNew = {

  createXhrObject: function() {

   return new ActiveXObject('Msxml2.XMLHTTP');

  }

 };

 var activeXOld = {

  createXhrObject: function() {

   return new ActiveXObject('Microsoft.XMLHTTP');

  }

 };

})();

/* SimpleXhrFactory singleton, step 2. */

var SimpleXhrFactory = (function() {

 // The three branches.

 var standard = {

  createXhrObject: function() {

   return new XMLHttpRequest();

  }

 };

 var activeXNew = {

  createXhrObject: function() {

   return new ActiveXObject('Msxml2.XMLHTTP');

  }

 };

 var activeXOld = {

  createXhrObject: function() {

   return new ActiveXObject('Microsoft.XMLHTTP');

  }

 };

 // To assign the branch, try each method; return whatever doesn't fail.

 var testObject;

 try {

  testObject = standard.createXhrObject();

  return standard; // Return this if no error was thrown.

 }

 catch(e) {

  try {

   testObject = activeXNew.createXhrObject();

   return activeXNew; // Return this if no error was thrown.

  }

  catch(e) {

   try {

    testObject = activeXOld.createXhrObject();

    return activeXOld; // Return this if no error was thrown.

   }

   catch(e) {

    throw new Error('No XHR object found in this environment.');

   }

  }

 }

})();

更多信息請查看網(wǎng)絡(luò)編程
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2026上岸·考公考編培訓(xùn)報(bào)班

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
久久精品系列| 国产日韩精品入口| 亚洲精选一区二区| 亚洲第一偷拍| 精品成人一区二区三区四区| 国产毛片精品视频| 国产精品最新自拍| 国产欧美 在线欧美| 国产精品黄视频| 国产精品国产三级国产普通话99 | 亚洲欧洲日本一区二区三区| 国产在线观看91精品一区| 国产精品久久久久av免费| 国产精品高清一区二区三区| 欧美日韩精品综合在线| 欧美日韩亚洲一区二区| 欧美日韩在线亚洲一区蜜芽| 欧美日韩亚洲一区| 国产精品福利网| 国产亚洲欧美一区| 伊人久久久大香线蕉综合直播 | 精久久久久久久久久久| 国产亚洲综合性久久久影院| 韩国一区二区三区美女美女秀| 国产综合在线视频| 亚洲二区免费| 亚洲精品资源美女情侣酒店| 亚洲美女黄色片| 亚洲午夜精品国产| 亚欧成人精品| 久久在线视频| 欧美美女福利视频| 国产精品亚洲综合一区在线观看| 久久久无码精品亚洲日韩按摩| 久久久精品视频成人| 免费观看在线综合| 国产精品ⅴa在线观看h| 国产一区二区欧美| 国产精品九九| 亚洲日韩成人| 久久精品欧美日韩| 国产婷婷精品| 久久免费视频在线观看| 最新亚洲一区| 久久久久久国产精品mv| 免费一区二区三区| 国产精品乱人伦一区二区 | 国产一区深夜福利| 一区二区三区四区蜜桃| 欧美福利在线| 亚洲高清色综合| 国产欧美精品在线播放| 亚洲午夜电影| 国产精品理论片在线观看| 国产精品你懂的| 国产精品欧美日韩一区| 国产精品久久久久久久久婷婷| 欧美激情一级片一区二区| 久久久欧美一区二区| 午夜精品av| 一区二区av| 99精品久久| 欧美亚洲综合另类| 亚洲乱码一区二区| 免费人成网站在线观看欧美高清| 国产亚洲欧美一级| 欧美午夜精品理论片a级大开眼界| 校园春色综合网| 亚洲午夜精品久久久久久浪潮| 好吊色欧美一区二区三区视频| 亚洲伊人伊色伊影伊综合网| 欧美电影免费观看高清完整版| 欧美成人免费网站| 亚洲大黄网站| 一区二区国产在线观看| 最新成人av网站| 午夜在线a亚洲v天堂网2018| 国产精品久久夜| 欧美丰满少妇xxxbbb| 99精品视频一区二区三区| 国产麻豆日韩| 免费欧美在线| 亚洲图片激情小说| 久久av免费一区| 一二三四社区欧美黄| 国产欧美一级| 亚洲天堂久久| 亚洲激情另类| 欧美日韩一二三四五区| 国产一区二区久久| 亚洲一卡久久| 国产欧美va欧美va香蕉在| 午夜伦欧美伦电影理论片| 国产精品美女久久久久久久| 久久精品国产一区二区电影| 狠狠狠色丁香婷婷综合久久五月 | 欧美另类变人与禽xxxxx| 国产视频在线观看一区二区| 欧美成人日韩| 妖精视频成人观看www| 亚洲免费中文| 欧美 日韩 国产在线| 一色屋精品亚洲香蕉网站| 欧美在线视频播放| 亚洲第一在线综合在线| 欧美日韩你懂的| 欧美亚洲尤物久久| 这里只有精品在线播放| 美女主播一区| 1024成人| 免费亚洲一区二区| 欧美va天堂在线| 亚洲国产成人av| 欧美日韩成人一区二区| 亚洲男人的天堂在线| 亚洲欧洲一区二区天堂久久 | 一区二区三区免费观看| 狠狠色综合一区二区| 亚洲一区二区av电影| 午夜欧美不卡精品aaaaa| 久久精品亚洲一区二区| 亚洲一区激情| 欧美专区在线观看一区| 国产精品永久免费观看| 欧美在线免费| 在线欧美小视频| 午夜精品久久久久久| 亚洲一区二区视频在线| 在线播放中文字幕一区| 亚洲理论电影网| 91久久国产综合久久蜜月精品| 在线免费观看视频一区| 国产在线精品成人一区二区三区| 国产中文一区二区| 亚洲欧洲偷拍精品| 午夜日韩电影| 欧美另类女人| 亚洲看片一区| 久久久久综合网| 欧美精品一卡二卡| 亚洲——在线| 99这里只有精品| 一区二区三区高清不卡| 欧美国产精品日韩| 亚洲激情校园春色| 欧美精品91| 9l国产精品久久久久麻豆| 欧美一区三区三区高中清蜜桃 | 一区二区三区久久网| 欧美岛国激情| 亚洲欧美日韩综合国产aⅴ| 雨宫琴音一区二区在线| 国产精品二区在线观看| 蜜桃av一区二区在线观看| 欧美一区2区视频在线观看| 日韩一级欧洲| 亚洲黄色片网站| 狠狠色狠狠色综合日日五| 国产精品一区二区在线观看不卡 | 免费欧美日韩| 久久久国产精品一区二区中文| 亚洲午夜精品久久| 99精品免费| 日韩视频免费| 亚洲国产老妈| 亚洲国产精品成人一区二区| 红杏aⅴ成人免费视频| 国产亚洲精品bv在线观看| 国产精品一区二区久久| 国产精品看片你懂得| 国产精品久99| 国产精品久久久久婷婷| 国产精品久久久久久户外露出 | 黄色成人精品网站| 激情欧美国产欧美| 黑人中文字幕一区二区三区| 国产欧美在线视频| 国产欧美精品日韩| 国产一区二区三区在线免费观看| 国产日韩欧美中文在线播放| 国产欧美一区二区精品婷婷| 国产欧美一区二区三区在线老狼| 国产精品亚洲综合久久| 国产欧美日韩在线视频| 国产亚洲午夜| 一区二区三区我不卡| 亚洲电影在线播放| 亚洲韩日在线| 在线一区亚洲| 欧美在线观看一区二区| 久久亚洲不卡| 欧美精品一区二区三区四区| 欧美日韩中文字幕综合视频| 国产精品美女999| 国产欧美日韩在线观看| 一区免费视频| 亚洲最新在线视频| 午夜精品一区二区在线观看 | 欧美日韩国产精品一区| 国产精品美女久久福利网站|