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

JS 設(shè)計模式之:單例模式定義與實現(xiàn)方法淺析

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

本文實例講述了JS 設(shè)計模式之:單例模式定義與實現(xiàn)方法。分享給大家供大家參考,具體如下:

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

今天先從最簡單的一個入手:單例模式。

文中的示例代碼會使用 ES6 語法,盡量簡化不必要的細節(jié)

概念

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

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

字面量寫法

最簡單的單例其實就像下面這樣:

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

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

如果想要一個不可變的單例對象:

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

Object.freeze(cat);

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

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

常用寫法

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

類單例

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

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

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

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

logger === logger2; // true

即盡管 new 了多次 Logger,它返回的都是同一個實例。

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

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

export default Logger;

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

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

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

工廠單例

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

let logger = null

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

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

export default createLogger;

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

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

下一篇我們再具體講講工廠模式的應(yīng)用~

參考內(nèi)容

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

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

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

相關(guān)文章

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

    JavaScript 在線壓縮和格式化收藏

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

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

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

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

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

    淺談PDF.js使用心得

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

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

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

    javascript:void(0)使用探討

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

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

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

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

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

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

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

    bootstrap時間插件daterangepicker使用詳解

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

最新評論

泗洪县| 探索| 眉山市| 太保市| 塘沽区| 阿坝| 亚东县| 宜章县| 呼和浩特市| 万荣县| 富民县| 德保县| 塔河县| 云南省| 佳木斯市| 图木舒克市| 石景山区| 贺兰县| 始兴县| 措美县| 榆社县| 望城县| 保定市| 思南县| 青龙| 泸溪县| 察哈| 太谷县| 甘南县| 大方县| 鲜城| 阿拉善盟| 三明市| 中牟县| 扎囊县| 拉萨市| 永和县| 图们市| 青阳县| 普格县| 临湘市|