位置: 编程技术 - 正文

JavaScript编程的单例设计模讲解(js编程实例)

编辑:rootadmin

推荐整理分享JavaScript编程的单例设计模讲解(js编程实例),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript编写,javascript编程用什么软件,javascript编程技术,javascript编程工具,javascript 编程,javascript编程基础,javascript 编程,javascript编程基础,内容如对您有帮助,希望把文章链接给更多的朋友!

在Javascript中,单例模式是一种最基本又经常用到的设计模式,可能在不经意间就用到了单例模式。本文将从最基础的理论开始,讲述单例模式的基本概念和实现,最后用一个例子来讲述单例模式的应用。

理论基础

概念

单例模式,顾名思义就是只有一个实例存在。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

基本结构

最简单的单例模式起始就是一个对象字面量,它将有关联的属性和方法组织到一起。

这种形式的单例模式,所有成员都是公开的,都可以通过singleton来访问。这样的缺点是单例中有一些辅助的方法并不希望暴露给使用者,如果使用者用了这些方法,然后在后面维护的时候,一些辅助方法被删除,这样会造成程序错误。如何避免这样从的错误呢?

包含私有成员的单例模式

要怎么在类中创建私有成员呢,这通过需要闭包来进行实现,关于闭包的知识,本文不再赘述,大家可以自行Google。基本形式如下:

首先是一个自执行的匿名函数,在匿名函数中,声明了一个变量privateVar,返回一个对象赋值给单例对象singleton。在匿名函数外部无法访问到privateVar变量,它就是单例对象的私有变量,只能在函数内部或通过暴露出来的方法去访问这个私有变量。这种形式又被成为模块模式。

惰性实例化

不管是直接字面量或者私有成员的单例模式,两者都是在脚本加载时就被创建出来的单例,但是有时候,页面可能永远也用不到这个单例对象,这样会造成资源浪费。对于这种情况,最佳的处理方式就是惰性加载,就是说在需要的时候才去真正实例化这个单例对象,如何实现呢?

首先将创建单例对象的代码封装到init函数中,然后声明一个私有变量instance表示单例对象的实例,公开一个方法getInstance来获取单例对象。调用的时候就通过singleton.getInstance()来进行调用,单例对象是在调用getInstance的时候才真正被创建。

适用场合

单例模式是JS中最常使用的设计模式,从增强模块性和代码组织性等方面来说,应该尽可能的使用单例模式。它可以把相关代码组织到一起便于维护,对于大型项目,每个模块惰性加载可以提高性能,隐藏实现细节,暴露出常用的api。常见的类库比如underscore,jQuery我们都可以将其理解为单例模式的应用。

结合实战

前面已经讲过,单例模式是最常用的设计模式之一,我们来举个例子进行说明,下面的代码主要实现一个简单的日期帮助类,通过单例模式实现:

JavaScript编程的单例设计模讲解(js编程实例)

基本的单例模式结构

这段代码通过对象字面量实现单例模式,使用的时候直接调用方法即可。

惰性加载实现单例模式

这就是惰性加载的单例模式。

下面再来看几个实例:实现1: 最简单的对象字面量

那么很显然的, t1 === t2 。

十分简单,并且非常使用,不足之处在于没有什么封装性,所有的属性方法都是暴露的。对于一些需要使用私有变量的情况就显得心有余而力不足了。当然在对于 this 的问题上也是有一定弊端的。

实现2:构造函数内部判断

其实和最初的JS实现有点类似,不过是将对是否已经存在该类的实例的判断放入构造函数内部。

那么也有的, t1 === t2 。

也是非常简单,无非就是提出一个属性来做判断,但是该方式也没有安全性,一旦我在外部修改了Construct的unique属性,那么单例模式也就被破坏了。

实现3 : 闭包方式

对于大着 灵活 牌子的JS来说,任何问题都能找到 n 种答案,只不过让我自己去掂量孰优孰劣而已,下面就简单的举几个使用闭包实现单例模式的方法,无非也就是将创建了的单例缓存而已。

只要 每次讲 var t1 = single; var t2 = single;即可。 与对象字面量方式类似。不过相对而言更安全一点,当然也不是绝对安全。

如果希望会用调用 single() 方式来使用,那么也只需要将内部的 return 改为

以上方式也可以使用 new 的方式来进行(形式主义的赶脚)。当然这边只是给了闭包的一种例子而已,也可以在 Construct 中判断单例是否存在 等等。 各种方式在各个不同情况做好选着即可。

总结

单例模式的好处在于对代码的组织作用,将相关的属性和方法封装在一个不会被多次实例化的对象中,让代码的维护和调试更加轻松。隐藏了实现细节,可以防止被错误修改,还防止了全局命名空间的污染。另外可以通过惰性加载提高性能,减少不必要的内存消耗。

简单学习JavaScript中的for语句循环结构 可以直接看示例,用得太多了,很简单(function(){for(vari=0,len=demoArr.length;ilen;i++){if(i==2){//return;//函数执行被终止//break;//循环被终止continue;//循环被跳过};con

JavaScript中利用各种循环进行遍历的方式总结 为了方便例子讲解,现有数组和json对象如下vardemoArr=['Javascript','Gulp','CSS3','Grunt','jQuery','angular'];vardemoObj={aaa:'Javascript',bbb:'Gulp',ccc:'CSS3',ddd:'Grunt',eee:'jQuery'

window.location.reload 刷新使用分析(去对话框) 使用window.location.reload;刷新时,如果提交数据的动作,则会出现讨厌的对话框!解决此问题,应该这样写:window.location.href=window.location.href;window.location.re

标签: js编程实例

本文链接地址:https://www.jiuchutong.com/biancheng/369946.html 转载请保留说明!

上一篇:深入解析JavaScript编程中的this关键字使用(深入解析抑郁症:什么是它的表现?别小看它的危害程度!)

下一篇:简单学习JavaScript中的for语句循环结构(java入门怎么学)

  • 金税盘证书密码被锁死
  • 主营业务税金及附加大概比例
  • 增值税普通发票需要交税吗
  • 支付的画图费没有发票要如何处理
  • 企业所得税本年实际缴纳不包括上年汇算清缴补缴税款吗
  • 一年房租正常摊销多少
  • 企业注销企业所得税年报怎么申报
  • 代开专票可以开13个点吗
  • 以前月度费用当期怎么入账合适?
  • 建安企业销售收入如何确认
  • 应付职工薪酬月末结转到哪里
  • 房产税入哪个科目
  • 房产税的征收对象有哪些
  • 税控盘年费每年都可以抵扣吗
  • 房屋修缮费交增值税吗
  • 销售蔬菜免税账务处理
  • 业务推广费税务处理
  • 总杠杆系数的计算公司
  • 员工罚款可以从工资里扣吗
  • 预缴附加税怎么做账
  • 企业注销后有收入怎么交税
  • 出口免税金额
  • 个人取得的工资、薪金所得应按次征收个人所得税
  • 应付职工薪酬包括个人社保和个税吗
  • 房子按季度收取租金,怎么交房产税
  • 固定资产可以一次性抵扣进项税吗
  • 微信支付被限制是怎么回事
  • 关于出售使用过的车辆
  • 售后回购怎么做账务处理
  • 税款入库期是什么意思
  • Python变量中forain
  • mongodb主从复制和副本集架构有什么联系和区别
  • 税率减按1.5%计算是什么意思
  • mysql连接数据库的基本步骤是什么
  • 无法偿付的应付账款计入什么科目政府会计
  • 公司印章样子
  • 加计扣除的增值税怎么做账
  • 其他债权投资应收利息计入什么
  • 企业对公帐户怎么转出私人帐户
  • 符合规定的国内旅客运输发票可以作为扣税凭证吗
  • 建安工程预缴税额怎么算
  • 什么叫代销合同
  • 减值准备减少记哪方
  • 物业公司收物业费不开发票违法吗
  • 公司私账银行流水
  • 去税务局核定税种多久生效
  • 教育费附加免征额
  • 小规模纳税人残保金减免政策
  • 没有发票的费用怎么报销
  • 管理会计的职能作用是
  • u盘怎么装win7系统步骤
  • ghost装win7无法启动
  • 让Windows XP、2003、2008自动登录的设置
  • Mac OSX通过homebrew卸载formula的方法
  • 连接远程mq
  • windows7桌面出现一个窗口删除不了
  • windows server 2016正式版下载激活安装设置教程
  • linux安装syslog
  • mac 地址栏
  • win8激活windows
  • win10系统无法安装到gpt分区
  • win10搭建ftp服务器的步骤
  • cocos2dx4.0教程
  • cocos2dx-js
  • python accdb
  • Cocos2dx3.2 Crazy Tetris update 定时更新 游戏逻辑处理
  • pycharm中文教程
  • 浅谈一下新冠的好处
  • android gradle task dependence
  • jQuery基本选择器
  • unity random.value
  • 广西发票查询平台
  • 单张发票开票限额?
  • 广州车辆购置税官网
  • 消费税征税环节
  • 核定征收,新企业怎么填
  • 买车险代收车船税多少钱
  • 地税服务大厅上班时间
  • 公寓土地增值税怎么算
  • 国地税合并6月15日挂牌
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设