电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

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

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

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

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

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

通常情況下,使用該模式是為了控制整個應用程序的狀態。在日常的開發中,我們遇到的單例模式可能有:Vuex 中的 StoreVue 的根實例任何導出單個對象的 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
相關文章:
主站蜘蛛池模板: 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 智慧消防-消防物联网系统云平台 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 糖衣机,除尘式糖衣机,全自动糖衣机,泰州市长江制药机械有限公司 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 电车线(用于供电给电车的输电线路)-百科 | 定制/定做冲锋衣厂家/公司-订做/订制冲锋衣价格/费用-北京圣达信 | 粘度计,数显粘度计,指针旋转粘度计| 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 高温链条油|高温润滑脂|轴承润滑脂|机器人保养用油|干膜润滑剂-东莞卓越化学 | 阿米巴企业经营-阿米巴咨询管理-阿米巴企业培训-广东键锋企业管理咨询有限公司 | 电缆接头_防水接头_电缆防水接头 - 乐清市新豪电气有限公司 | 合肥卓创建筑装饰,专业办公室装饰、商业空间装修与设计。 | 河北码上网络科技|邯郸小程序开发|邯郸微信开发|邯郸网站建设 | 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 | 陕西自考报名_陕西自学考试网 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 紧急泄压人孔_防爆阻火器_阻火呼吸阀[河北宏泽石化] | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 上海办公室设计_办公楼,写字楼装修_办公室装修公司-匠御设计 | 工控机-图像采集卡-PoE网卡-人工智能-工业主板-深圳朗锐智科 | 电动葫芦|手拉葫芦|环链电动葫芦|微型电动葫芦-北京市凌鹰起重机械有限公司 | 浙江皓格药业有限公司| 上海风淋室_上海风淋室厂家_上海风淋室价格_上海伯淋 | 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 便携式表面粗糙度仪-彩屏硬度计-分体式粗糙度仪-北京凯达科仪科技有限公司 | 美能达分光测色仪_爱色丽分光测色仪-苏州方特电子科技有限公司 | 杭州荣奥家具有限公司-浙江办公家具,杭州办公家具厂 | 嘉兴恒升声级计-湖南衡仪声级计-杭州爱华多功能声级计-上海邦沃仪器设备有限公司 | CXB船用变压器-JCZ系列制动器-HH101船用铜质开关-上海永上船舶电器厂 | 恒温振荡混匀器-微孔板振荡器厂家-多管涡旋混匀器厂家-合肥艾本森(www.17world.net) | 健身器材-健身器材厂家专卖-上海七诚健身器材有限公司 | 亿诺千企网-企业核心产品贸易 | 成都竞价托管_抖音代运营_网站建设_成都SEM外包-成都智网创联网络科技有限公司 | 阜阳在线-阜阳综合门户 | 模切之家-专注服务模切行业的B2B平台! | 精密交叉滚子轴承厂家,转盘轴承,YRT转台轴承-洛阳千协轴承 | 济南品牌设计-济南品牌策划-即合品牌策划设计-山东即合官网 | 压力变送器-上海武锐自动化设备有限公司 | 【ph计】|在线ph计|工业ph计|ph计厂家|ph计价格|酸度计生产厂家_武汉吉尔德科技有限公司 | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | 翅片管散热器价格_钢制暖气片报价_钢制板式散热器厂家「河北冀春暖气片有限公司」 | 空冷器|空气冷却器|空水冷却器-无锡赛迪森机械有限公司[官网] |