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

JS 設(shè)計(jì)模式之:?jiǎn)卫J蕉x與實(shí)現(xiàn)方法淺析

 更新時(shí)間:2020年05月06日 10:57:18   作者:savokiss  
這篇文章主要介紹了JS 設(shè)計(jì)模式之:?jiǎn)卫J?結(jié)合實(shí)例形式分析了JS 單例模式原理、定義、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了JS 設(shè)計(jì)模式之:?jiǎn)卫J蕉x與實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:

良好的設(shè)計(jì)模式可以顯著提高代碼的可讀性,降低復(fù)雜度和維護(hù)成本。筆者打算通過幾篇文章通俗地講一講常見的或者實(shí)用的設(shè)計(jì)模式。

今天先從最簡(jiǎn)單的一個(gè)入手:?jiǎn)卫J健?/p>

文中的示例代碼會(huì)使用 ES6 語(yǔ)法,盡量簡(jiǎn)化不必要的細(xì)節(jié)

概念

單例模式(Singleton)屬于創(chuàng)建型的設(shè)計(jì)模式,它限制我們只能創(chuàng)建單一對(duì)象或者某個(gè)類的單一實(shí)例。

通常情況下,使用該模式是為了控制整個(gè)應(yīng)用程序的狀態(tài)。在日常的開發(fā)中,我們遇到的單例模式可能有:Vuex 中的 StoreVue 的根實(shí)例,任何導(dǎo)出單個(gè)對(duì)象的 ES6 模塊等。

字面量寫法

最簡(jiǎn)單的單例其實(shí)就像下面這樣:

const cat = {
  name: 'mi',
  age: 4
}

了解 const 語(yǔ)法的小伙伴都知道,這只喵是不能被重新賦值的,但是它里面的屬性其實(shí)是可變的。

如果想要一個(gè)不可變的單例對(duì)象:

const cat = {
  name: 'mi',
  age: 4
}

Object.freeze(cat);

這樣就不能新增或修改這只喵上的任何屬性,它變成了 冰凍喵~

如果是在模塊中使用,上面的寫法并不會(huì)污染全局作用域,但是直接生成一個(gè)固定的對(duì)象缺少了一些靈活性。

常用寫法

相對(duì)而言,使用類或工廠方法來實(shí)現(xiàn)單例更加常用。假設(shè)我們有一個(gè)叫作 Logger 的類,它具有和 Console 相同的 API。

類單例

類的單例寫法非常常用,如果我們想要這么使用它:

const logger = new Logger();
logger.log('msg');

// 這里大概寫了 1000 行代碼

const logger2 = new Logger();
logger.log('new msg');

logger === logger2; // true

即盡管 new 了多次 Logger,它返回的都是同一個(gè)實(shí)例。

下面直接看最實(shí)用的實(shí)現(xiàn)方式:

class Logger {
  constructor () {
    if (!Logger._singleton) {
      Logger._singleton = this;
    }
    return Logger._singleton;
  }
  
  log (...args) {
    console.log(...args);
  }
}

export default Logger;

上面的方式將單例對(duì)象存儲(chǔ)在了構(gòu)造器上,這樣的話不管 new Logger 多少次,返回的都是同一個(gè) Logger 實(shí)例了。

這里有一個(gè)細(xì)節(jié)需要注意,即 new 關(guān)鍵字后面的構(gòu)造函數(shù)如果顯式返回一個(gè)對(duì)象,new 表達(dá)式就會(huì)返回該對(duì)象。

具體可參見 《你不知道的 JavaScript (上卷)》中的 new 綁定 相關(guān)章節(jié)。

工廠單例

如果不喜歡用 new 關(guān)鍵字,可以使用工廠方法返回單例對(duì)象。

let logger = null

class Logger {
  log (...args) {
    console.log(...args);
  }
}

function createLogger() {
  if (!logger) {
    logger = new Logger();
  }
  return logger;
}

export default createLogger;

上面的代碼相當(dāng)于在模塊內(nèi)部緩存了 logger 實(shí)例,然后導(dǎo)出了一個(gè)工廠方法。這種寫法在模塊化代碼中比較常見,工廠方法也可以接收參數(shù)用來初始化單例對(duì)象。

今天的內(nèi)容比較好理解,其中的單例寫法也是筆者常用的方法。

下一篇我們?cè)倬唧w講講工廠模式的應(yīng)用~

參考內(nèi)容

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • JavaScript 在線壓縮和格式化收藏

    JavaScript 在線壓縮和格式化收藏

    國(guó)外人寫的在線壓縮和格式化工具這兩套程序都是用純 JavaScript 寫的,可以下載下來離線使用,很方便。
    2009-01-01
  • webapi根據(jù)id獲取元素的實(shí)現(xiàn)思路

    webapi根據(jù)id獲取元素的實(shí)現(xiàn)思路

    掌握document.getElementById() 根據(jù)id獲取元素,在頁(yè)面畫出一個(gè)寬200 高200 粉色的盒子, 在控制臺(tái)打印這個(gè)盒子,接到這樣的需求如何處理呢,下面小編給大家分享webapi根據(jù)id獲取元素的實(shí)現(xiàn)思路,感興趣的朋友一起看看吧
    2024-02-02
  • js判斷某個(gè)字符出現(xiàn)的次數(shù)的簡(jiǎn)單實(shí)例

    js判斷某個(gè)字符出現(xiàn)的次數(shù)的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)硪黄猨s判斷某個(gè)字符出現(xiàn)的次數(shù)的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • 淺談PDF.js使用心得

    淺談PDF.js使用心得

    本篇文章主要介紹了淺談PDF.js使用心得,pdf.js 是一個(gè)技術(shù)原型主要用于在 HTML5 平臺(tái)上展示 PDF 文檔,無需任何本地技術(shù)支持。非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-06-06
  • JS中的forEach、$.each、map方法推薦

    JS中的forEach、$.each、map方法推薦

    下面小編就為大家?guī)硪黄狫S中的forEach、$.each、map方法推薦。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-04-04
  • javascript:void(0)使用探討

    javascript:void(0)使用探討

    如果想做一個(gè)鏈接點(diǎn)擊后不做任何事情,或者響應(yīng)點(diǎn)擊而完成其他事情一般都是設(shè)置屬性href = "#"其實(shí)還有比這更好的方法,下面為大家整理了幾種比較常見的解決方法,感興趣的朋友可以參考下
    2013-08-08
  • javascript解決innerText瀏覽器兼容問題思路代碼

    javascript解決innerText瀏覽器兼容問題思路代碼

    innerText瀏覽器兼容這塊始終都是一個(gè)問題,下面與大家分享下使用javascript解決,感興趣的朋友可以參考下哈,希望對(duì)你有所幫助
    2013-05-05
  • js常用的繼承--組合式繼承

    js常用的繼承--組合式繼承

    本篇文章主要介紹了js常用的繼承--組合式繼承的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • 使用webpack搭建pixi.js開發(fā)環(huán)境

    使用webpack搭建pixi.js開發(fā)環(huán)境

    這篇文章主要介紹了使用webpack搭建pixi.js開發(fā)環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • bootstrap時(shí)間插件daterangepicker使用詳解

    bootstrap時(shí)間插件daterangepicker使用詳解

    這篇文章主要為大家詳細(xì)介紹了bootstrap時(shí)間插件daterangepicker使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評(píng)論

绩溪县| 永善县| 白山市| 奉节县| 南木林县| 吉安县| 共和县| 乐亭县| 田林县| 蒙自县| 凌云县| 隆林| 巩留县| 黄山市| 南靖县| 临猗县| 浦东新区| 莆田市| 肥乡县| 西吉县| 琼海市| 自贡市| 英山县| 桂平市| 新邵县| 虎林市| 收藏| 紫阳县| 界首市| 丹寨县| 河源市| 镇江市| 黎平县| 长岭县| 谷城县| 灌云县| 胶州市| 新巴尔虎左旗| 合山市| 巢湖市| 常熟市|