成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript設(shè)計(jì)模式系列二:?jiǎn)卫J?

SegmentFault / 714人閱讀

摘要:什么時(shí)候需要用到單例模式呢其實(shí)單例模式在日常開(kāi)發(fā)中的使用非常的廣泛,例如各種浮窗像登錄浮窗等,無(wú)論我們點(diǎn)擊多少次,都是同一個(gè)浮窗,浮窗從始至終只創(chuàng)建了一次。這種場(chǎng)景就十分適合運(yùn)用單例模式。

單例模式 什么是單例模式?

單例模式的定義:一個(gè)類(lèi)僅有一個(gè)實(shí)例,并且可以在全局訪問(wèn)。
什么時(shí)候需要用到單例模式呢?其實(shí)單例模式在日常開(kāi)發(fā)中的使用非常的廣泛,例如各種浮窗、像登錄浮窗等,無(wú)論我們點(diǎn)擊多少次,都是同一個(gè)浮窗,浮窗從始至終只創(chuàng)建了一次。這種場(chǎng)景就十分適合運(yùn)用單例模式。

代碼實(shí)現(xiàn)

我們創(chuàng)建一個(gè)“最老的人”的類(lèi),很明顯,“最老的人”有且只有一個(gè)。這很符合我們單例模式的運(yùn)用場(chǎng)景。我們先來(lái)看看完整代碼:

var oldestMan = function (name) {
  this.name = name;
}

oldestMan.prototype.getName = function () {
  console.log(this.name);
}
//引入一個(gè)代理函數(shù)和閉包的概念
var createOldestMan = (function () {
  var instance;
  return function (name) {
      if (!instance) {
         instance = new oldestMan(name);
      }
      return instance;
  }
})();

var personA = createOldestMan("holz");
var personB = createOldestMan("Amy");
personA.getName();  //  holz
personB.getName();  //  holz

我們可以在控制臺(tái)上看到即使調(diào)用了兩次createOldestMan并且賦了不一樣的值,但兩次getName()輸出的都是第一次的“holz”。這就是單例模式。

代碼看不太懂?沒(méi)關(guān)系,現(xiàn)在給大家一一講解。
首先我們創(chuàng)建了一個(gè)oldestMan類(lèi),創(chuàng)建了一個(gè)name屬性。然后我們通過(guò) prototype 給它添加一個(gè)getName()方法用來(lái)獲取oldestMan的名字,相信到這里大家都是懂的,然后下面一段代碼就是重點(diǎn)了,也比較難理解。我們打這段代碼多帶帶拿出來(lái)將一下。

//引入一個(gè)代理函數(shù)和閉包的概念
var createOldestMan = (function () {
  var instance;
  return function (name) {
      if (!instance) {
         instance = new oldestMan(name);
      }
      return instance;
  }
})();

首先,我們不用管什么是代理函數(shù),之所以叫它代理函數(shù)是因?yàn)樗o助我們實(shí)現(xiàn)單例模式的效果,這段函數(shù)第一個(gè)關(guān)鍵點(diǎn)是 createOldestMan() 是一個(gè)立即執(zhí)行函數(shù)。立即函數(shù)在聲明的時(shí)候就會(huì)立即執(zhí)行,也就是在聲明createOldestMan的時(shí)候這個(gè)函數(shù)就會(huì)執(zhí)行,它會(huì)聲明一個(gè)instance 變量,然后返回一個(gè)函數(shù)給createOldestMan。createOldestMan就相當(dāng)于:

var createOldestMan = function (name) {
      if (!instance) {
         instance = new oldestMan(name);
      }
      return instance;
  }

第二個(gè)關(guān)鍵點(diǎn)是:這里利用了 閉包 的概念。

閉包是什么呢?我只需要記住當(dāng)函數(shù)在定義時(shí)的語(yǔ)法作用域之外被調(diào)用,卻還能訪問(wèn)定義時(shí)的語(yǔ)法作用域時(shí),就是產(chǎn)生了閉包。

我們來(lái)看一下我們的代碼,函數(shù)先定義了一個(gè)instance,然后再返回一個(gè)function(name),這個(gè)function(name)里面用到了instance變量。在正常情況下,在立即執(zhí)行函數(shù)執(zhí)行之后,instance變量就會(huì)被JavaScript的垃圾回收機(jī)制回收,但是因?yàn)閒unction(name)被返回到了外部,而function(name)隨時(shí)會(huì)被調(diào)用,隨時(shí)會(huì)訪問(wèn)到instance變量,所以instance變量被保留在了內(nèi)存中。這就產(chǎn)生了閉包。也就是說(shuō),function(name)被賦值給了外部的createOldestMan,在外部的語(yǔ)法作用域中執(zhí)行,但還可以訪問(wèn)到定義時(shí)內(nèi)部的語(yǔ)法作用域中的instance。

所以在 立即執(zhí)行函數(shù)閉包 的作用下,instance只被申請(qǐng)了一次,也就是只有一個(gè)instance。也就是說(shuō),我們無(wú)論執(zhí)行多少次createOldestMan("..."),instance只會(huì)是第一次的那個(gè)值。所以我們就可以判斷instance是否已經(jīng)被實(shí)例化了,來(lái)給instance賦值,如果instance已經(jīng)被實(shí)例化,就返回instance。這就達(dá)到了一個(gè)類(lèi)只有一個(gè)實(shí)例的效果。

通用的單例模式

我還可以改造一下代碼,因?yàn)樵陂_(kāi)發(fā)中,我們可能不僅只有一個(gè)單例,所以我們應(yīng)該讓代碼能夠變得各個(gè)單例通用。我們應(yīng)該在哪里改呢?沒(méi)錯(cuò),改代理函數(shù)。我們只需要把代理函數(shù)中的oldestMan()提取出來(lái),改為以參數(shù)的形式傳值,不局限于oldestMan()。

var singleObj;
var createSingleton = function (fn) {
  return function (text) {
    if (!singleObj) {
      singleObj = new fn (text);
    }
    return singleObj;
  }
}

這樣我們就可以把單例作為參數(shù)傳進(jìn)去,用它實(shí)現(xiàn)不同的單例了。
完整代碼是這樣的:

var oldestMan = function (name) {
  this.name = name;
}

oldestMan.prototype.getName = function () {
  console.log(this.name);
}

//一個(gè)通用的代理函數(shù)
var singleObj;
var createSingleton = function (fn) {
  return function (text) {
    if (!singleObj) {
    singleObj = new fn (text);
    }
    return singleObj;
  }
}

var person_1 = createSingleton(oldestMan)("holz");
var person_2 = createSingleton(oldestMan)("tom");
person_1.getName(); //holz
person_2.getName(); //holz

同樣,即使再次調(diào)用createSingleton并傳入不同的值,輸出的依舊是第一次的“holz”。

總結(jié)

單例模式的定義:一個(gè)類(lèi)僅有一個(gè)實(shí)例,并且可以在全局訪問(wèn)。
適用場(chǎng)景:其實(shí)單例模式在日常開(kāi)發(fā)中的使用非常的廣泛,例如各種浮窗、像登錄浮窗等,無(wú)論我們點(diǎn)擊多少次,都是同一個(gè)浮窗,浮窗從始至終只創(chuàng)建了一次。這種場(chǎng)景就十分適合運(yùn)用單例模式。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90370.html

相關(guān)文章

  • javaScript設(shè)計(jì)模式系列) 單體模式

    摘要:使用構(gòu)造函數(shù)如果被實(shí)例化過(guò),就返回實(shí)例化的結(jié)果這種方式比較簡(jiǎn)潔,通過(guò)判斷是否已經(jīng)實(shí)例化過(guò),但是也沒(méi)啥安全性,如果在外部修改那很可能單例模式就被破壞了。 摘要 單體模式也有人稱(chēng)為單例模式,是javaScript 中最基本但又最有用的模式之一。 什么是單體 一講到概念第一反應(yīng)就是WTFshowImg(https://segmentfault.com/img/bVSUdx?w=600&h=3...

    ZoomQuiet 評(píng)論0 收藏0
  • JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐系列單例模式

    摘要:本系列為設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐作者曾探學(xué)習(xí)總結(jié),如想深入了解,請(qǐng)支持作者原版單例模式實(shí)現(xiàn)單例模式單例模式的定義是保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。 本系列為《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》(作者:曾探)學(xué)習(xí)總結(jié),如想深入了解,請(qǐng)支持作者原版 單例模式 實(shí)現(xiàn)單例模式 單例模式的定義是:保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。單例模式是一種常用的模式...

    Airy 評(píng)論0 收藏0
  • JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》讀書(shū)筆記

    摘要:訂閱模式的一個(gè)典型的應(yīng)用就是后面會(huì)寫(xiě)一篇相關(guān)的讀書(shū)筆記。享元模式享元模式的核心思想是對(duì)象復(fù)用,減少對(duì)象數(shù)量,減少內(nèi)存開(kāi)銷(xiāo)。適配器模式對(duì)目標(biāo)函數(shù)進(jìn)行數(shù)據(jù)參數(shù)轉(zhuǎn)化,使其符合目標(biāo)函數(shù)所需要的格式。 設(shè)計(jì)模式 單例模式 JS的單例模式有別于傳統(tǒng)面向?qū)ο笳Z(yǔ)言的單例模式,js作為一門(mén)無(wú)類(lèi)的語(yǔ)言。使用全局變量的模式來(lái)實(shí)現(xiàn)單例模式思想。js里面的單例又分為普通單例和惰性單例,惰性單例指的是只有這個(gè)實(shí)例...

    Panda 評(píng)論0 收藏0
  • JavaScript面試系列JavaScript設(shè)計(jì)模式之橋接模式和懶加載

    摘要:橋接模式的核心在于將抽象部分和它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化。看起來(lái)這個(gè)版本已經(jīng)很完美了不,它仍然有可以?xún)?yōu)化的空間,即題目提到的橋接模式。使用橋接模式的實(shí)現(xiàn)版本這個(gè)實(shí)現(xiàn)包含了三個(gè)函數(shù)。這個(gè)例子體現(xiàn)了橋接模式的作用。 我寫(xiě)的程序員面試系列文章 Java面試系列-webapp文件夾和WebContent文件夾的區(qū)別? 程序員面試系列:Spring MVC能響應(yīng)HTTP請(qǐng)求的原因?...

    tracymac7 評(píng)論0 收藏0
  • 聽(tīng)飛狐聊JavaScript設(shè)計(jì)模式系列06

    本回內(nèi)容介紹 上一回聊到JS中模擬接口,裝飾者模式,摻元類(lèi),分析了backbone的繼承源碼,感覺(jué)還好吧! 介一回,偶們來(lái)聊一下在JS單例模式(singleton),單例模式其實(shí)運(yùn)用很廣泛,比如:jquery,AngularJS,underscore吖蝦米的都是單例模式,來(lái)吧,直接開(kāi)始咯: 1. 單例模式 保證一個(gè)類(lèi)只有一個(gè)實(shí)例,從全局命名空間里提供一個(gè)唯一的訪問(wèn)點(diǎn)來(lái)訪問(wèn)該對(duì)象。其實(shí)之前寫(xiě)過(guò)的對(duì)象...

    hiYoHoo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<