位置: 编程技术 - 正文

学习JavaScript设计模式(封装)(javascript教程 csdn)

编辑:rootadmin

推荐整理分享学习JavaScript设计模式(封装)(javascript教程 csdn),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript如何学,javascript设计,javascript如何学,javascript教程 csdn,javascript设计,javascript教程chm,javascript教程 csdn,javascript课设,内容如对您有帮助,希望把文章链接给更多的朋友!

在JavaScript 中,并没有对抽象类和接口的支持。JavaScript 本身也是一门弱类型语言。在封装类型方面,JavaScript 没有能力,也没有必要做得更多。对于JavaScript 的设计模式实现来说,不区分类型是一种失色,也可以说是一种解脱。

从设计模式的角度出发,封装在更重要的层面体现为封装变化。

通过封装变化的方式,把系统中稳定不变的部分和容易变化的部分隔离开来,在系统的演变过程中,我们只需要替换那些容易变化的部分,如果这些部分是已经封装好的,替换起来也相对容易。这可以最大程度地保证程序的稳定性和可扩展性。

javascript封装的的基本模式有3种:

1、使用约定优先的原则,将所有的私有变量以_开头

看完代码,是不是有种被坑的感觉,仅仅把所有的变量以_开头,其实还是可以直接访问的,这能叫封装么,当然了,说了是约定优先嘛。

下划线的这种用法这一个众所周知的命名规范,它表明一个属性仅供对象内部使用,直接访问它或设置它可能会导致意想不到的后果。这有助于防止程序员对它的无意使用,却不能防止对它的有意使用。

学习JavaScript设计模式(封装)(javascript教程 csdn)

这种方式还是不错的,最起码成员变量的getter,setter方法都是prototype中,并非存在对象中,总体来说还是个不错的选择。如果你觉得,这不行,必须严格实现封装,那么看第二种方式。

2、严格实现封装

那么这与我们先前讲过的其他创建对象的模式有什么不同呢,在上面的例子中,我们在创建和引用对象的属性时总要使用this关键字。而在本例中,我们用var声明这些变量。这意味着它们只存在于Person构造器中。checkno函数也是用同样的方式声明的,因此成了一个私用方法。

需要访问这些变量和函数的方法只需要声明在Person中即可。这些方法被称为特权方法,因为它们是公用方法,但却能够访问私用属性和方法。为了在对象外部能访问这些特权函数,它们的前面被加上了关键字this。因为这些方法定义于Person构造器的作用域,所以它们能访问到私用属性。引用这些属性时并没有使用this关键字,因为它们不是公开的。所有取值器和赋值器方法都被改为不加this地直接引用这些属性。

任何不需要直接访问的私用属性的方法都可以像原来那样在Person.prototype中声明。像toString()方法。只有那些需要直接访问私用成员的方法才应该被设计为特权方法。但特权方法太多又会占用过多的内存,因为每个对象实例都包含所有特权方法的新副本。

看上面的代码,去掉了this.属性名,严格的实现了封装,只能通过getter,setter访问成员变量了,但是存在一个问题,所有的方法都存在对象中,增加了内存的开销。

3、以闭包的方式封装

上述代码,js引擎加载完后,会直接执行Person = 立即执行函数,然后此函数返回了一个子函数,这个子函数才是new Person所调用的构造函数,又因为子函数中保持了对立即执行函数中checkNo(no) ,times的引用,(很明显的闭包)所以对于checkNo和times,是所有Person对象所共有的,创建3个对象后,times分别为0,1,2 。这种方式的好处是,可以使Person中需要复用的方法和属性做到私有且对象间共享。

这里的私用成员和特权成员仍然被声明在构造器。但那个构造器却从原来的普通函数变成了一个内嵌函数,并且被作为包含它的函数的返回值给变量Person。这就创建了一个闭包,你可以把静态的私用成员声明在里面。位于外层函数声明之后的一对空括号很重要,其作用是代码一载入就立即执行这个函数。这个函数的返回值是另一个函数,它被赋给Person变量,Person因此成了一个构造函数。在实例华Person时,所调用的这个内层函数。外层那个函数只是用于创建一个可以用来存储静态成员的闭包。

在本例中,checkno被设计成为静态方法,原因是为Person的每个实例都生成这个方法的一个新副本毫无道理。此外还有一个静态属性times,其作用在于跟踪Person构造器的总调用次数。

标签: javascript教程 csdn

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

上一篇:JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果(javascript密码框)

下一篇:js图片跟随鼠标移动代码(js鼠标滚动控制图片缩放)

  • 旧设备出口增值税处理
  • 向银行借款存入银行会引起
  • 低值易耗可以直接入管理费用吗
  • 客户到期不付款如何处理
  • 企业注销其他应付款可以转入未分配利润吗
  • 房产税城镇土地使用税减免政策
  • 债券的投资收益率
  • 出口货物的销售额怎么算
  • 应付账款借方余额在资产负债表中怎么列示
  • 不带息票据贴现计算公式
  • 增值税进项销项每个月需要结转吗
  • 预收房款发票开具需要注意哪些?
  • 注册资本金印花税减半征收
  • abs应付债券
  • 进项发票已入账抵扣后开负数红冲怎么处理
  • 零申报的企业所得税年报怎么填
  • 公司转账给法人最多可以转多少
  • 企业已交地税税金如何做账务处理?
  • 股东利润分配预缴税款
  • 怎么计算附加税税率
  • 企业收到政府补贴100000元业务题
  • 未开发票的结算款怎么入账?
  • 样品寄送时运费支付的对策
  • 工会经费该怎么交
  • 并购动因理论有什么
  • 在禁用uac时无法激活什么原因
  • 在Mac OS Yosemite 系统中如何发送超大邮件附件
  • win10磁盘碎片整理打不开
  • PHP:pcntl_wifsignaled()的用法_PCNTL函数
  • PHP:ob_iconv_handler()的用法_iconv函数
  • 税款返还的会计处理方法
  • uniapp仿微信
  • 职工取得全年一次性奖金如何计算缴纳个人所得税?
  • 公转私备注用途
  • 大自然水族馆怎么样
  • 拖拉机拖拉机耕地
  • 大数据相关框架
  • 企业资产损失税前扣除管理办法最新
  • 在建工程明细科目有土地使用权摊销吗
  • java基础运算符有哪些
  • 织梦收费5800的解决方法
  • 商标注册费用可以退吗
  • 小规模纳税人收普票和专票有什么区别
  • 现金流量表的编制公式 计算公式
  • 通过创建SQLServer 2005到 Oracle10g 的链接服务器实现异构数据库数据转换方案
  • 固定资产盘盈为什么计入管理费用
  • 税金及附加与应交税金的关系
  • 工会经费和残保金计入什么科目
  • 房地产开发产品科目设置
  • 应收账款期初余额在借方还是贷方
  • 印花税如何申请退税
  • 现金发放工资有什么风险
  • 购买产品样品计入什么科目
  • 销售收入确认后怎么处理
  • 小规模纳税人企业所得税税率
  • 如何登录网络?
  • 小规模需要进项税额吗
  • sql语句大全实例教程
  • solaris 安装
  • windows无法安装所需的文件,请确保所需的所有文件可用
  • Windows 7 64位系统手动添加Editplus到鼠标右键的方法
  • 晨枫U盘启动工具v2.0
  • windowsxp弹出广告怎么解决
  • centos32
  • centos7.6桌面版安装教程
  • 显示win7
  • psrameters
  • 复制链接
  • linux程序打包和安装
  • django settings.py
  • hbuilderx打包app教程
  • linux用python
  • Unity for Absolute Beginners(三)
  • java script教程
  • 地税办理停保
  • 河南省国家税务局电子税务局
  • 购进用于生产的设备会计分录
  • 辽宁社保网上申报流程图
  • 税控发票开票软件(金税盘版)事件代码768功能代码5?
  • 消费发票上的金额含税吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设