色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

JS 設計模式之:單例模式定義與實現方法淺析

瀏覽:99日期:2024-05-09 18:28:29

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

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

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

文中的示例代碼會使用 ES6 語法,盡量簡化不必要的細節概念

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

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

字面量寫法

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

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

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

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

const cat = { name: ’mi’, age: 4}Object.freeze(cat);

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

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

常用寫法

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

類單例

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

const logger = new Logger();logger.log(’msg’);// 這里大概寫了 1000 行代碼const logger2 = new Logger();logger.log(’new msg’);logger === logger2; // true

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

下面直接看最實用的實現方式:

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

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

這里有一個細節需要注意,即 new 關鍵字后面的構造函數如果顯式返回一個對象,new 表達式就會返回該對象。

具體可參見 《你不知道的 JavaScript (上卷)》中的 new 綁定 相關章節。工廠單例

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

let logger = nullclass Logger { log (...args) { console.log(...args); }}function createLogger() { if (!logger) { logger = new Logger(); } return logger;}export default createLogger;

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

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

下一篇我們再具體講講工廠模式的應用~

參考內容 《JavaScript 設計模式》 《JavaScript 面向對象編程指南》 《你不知道的 JavaScript (上卷)》 Working with Singletons in JavaScript

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

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結》

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

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 欧美日韩视频在线第一区二区三区 | 日本久久久久久久久久 | 国产欧美精品区一区二区三区 | 午夜欧美 | 欧美成人午夜做爰视频在线观看 | 色老头一区二区三区在线观看 | 一级女性全黄久久生活片 | 手机看片精品高清国产日韩 | 国产亚洲综合在线 | 国产精品高清一区二区 | 女人扒开双腿让男人捅 | 亲子乱子伦xxxx | 美国一级大黄香蕉片 | 拍真实国产伦偷精品 | 国产高清在线精品一区二区 | 欧美一级久久久久久久大片 | 亚洲精品免费观看 | 欧美视频在线观 | 91精品观看91久久久久久 | 欧美激情一区二区三区高清视频 | 一区二区三区视频在线观看 | 欧美极品在线视频 | www.亚色 | 99av在线| 日韩视频在线观看 | 日韩欧美亚洲 | 国产一区二区在线视频播放 | 欧美成人 一区二区三区 | 久久国产精品歌舞团 | 国产日韩欧美精品在线 | 国产a网站| 性色欧美xo影院 | 国产特黄1级毛片 | 精品无码一区在线观看 | 精品亚洲成a人在线播放 | 免费a级片网站 | 成人久久18免费网站入口 | 日韩在线视频免费不卡一区 | 国产精品久久久久久久 | 精品综合久久久久久88小说 | 欧美同性videos在线可播放 |