位置: 编程技术 - 正文

使用Object.defineProperty实现简单的js双向绑定(使用的拼音)

编辑:rootadmin

推荐整理分享使用Object.defineProperty实现简单的js双向绑定(使用的拼音),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:使用二氧化碳灭火器时人应该站在什么位置,使用时间,使用粗盐热敷十大危害,使用的拼音,使用筷子就餐会不会传染乙肝病毒,使用权资产,使用灭火器时要对准火焰的什么部位喷射,使用时间,内容如对您有帮助,希望把文章链接给更多的朋友!

缘起

前几天在看一些流行的迷你mvvm框架(比如avalon.js、 vue.js 这种较轻的框架,而非Angularjs、Emberjs这种较重的框架)的实现。现代流行的mvvm框架一般都会将数据双向绑定(two-ways data binding)做掉,作为框架自身的一个卖点( Ember.js 貌似是不支持数据双向绑定的。),而且每种框架双向数据绑定的实现方式都不太一致,比如Anguarjs内部使用的是 脏检查 ,而avalon.js内部实现方式的本质是设置 属性访问器 。

这里不打算具体的讨论各个框架对双向数据绑定的具体实现,仅说一下前端实现双向数据绑定的几种常用方法,并着重讲一下avalon.js实现双向数据绑定的技术选型。

双向数据绑定的常规实现方式

首先我们来说一下何为前端的 双向数据绑定 。简单的来说,就是框架的控制器层(这里的控制器层是一个泛指,可以理解为控制view行为和联系model层的中间件)和UI展示层(view层)建立一个双向的数据通道。当这两层中的任何一方发生变化时,另一层将会立即(或者看起来是 立即 )自动作出相应的变化。

一般来说要实现这种双向数据绑定关系(控制器层与展示层的关联过程),在前端目前会有三种方式,

1.脏检查

2.观察机制

3.封装属性访问器

脏检查

我们说Angularjs(这里特指AngularJS 1.x.x版本,不代表AngularJS 2.x.x版本)双向数据绑定的技术实现是脏检查,大致的原理就是,Angularjs内部会维护一个序列,将所有需要监控的属性放在这个序列中,当发生某些特定事件时(注意,这里并不是定时的而是由某些特殊事件触发的),Angularjs会调用 $digest 方法,这个方法内部做的逻辑就是遍历所有的watcher,对被监控的属性做对比,对比其在方法调用前后属性值有没有发生变化,如果发生变化,则调用对应的handler。网上有许多剖析Angularjs双向数据绑定实现原理的文章,比如 这篇 ,再比如 这篇 ,等等。

这种方式的缺点很明显,遍历轮训watcher是非常消耗性能的,特别是当单页的监控数量达到一个数量级的时候。

观察机制

博主之前有一篇转载翻译的文章, Object.observe()带来的数据绑定变革 ,说的就是使用ECMAScript7中的 Object.observe 方法对对象(或者其属性)进行监控观察,一旦其发生变化时,将会执行相应的handler。

这是目前监控属性数据变更最完美的一种方法,语言(浏览器)原生支持,没有什么比这个更好了。唯一的遗憾就是目前支持广度还不行,有待全面推广。

封装属性访问器

在php中有 魔术方法 这样一种概念,比如php中的 __get() 和 __set() 方法。在javascript中也有类似的概念,不过不叫魔术方法,而是叫做访问器。我们来看个示例代码,

从上面的代码中我们可以管中窥豹,比如 data 中的 getName() 和 setName() 方法,我们可以简单的将其看成 data.name 的访问器(或者叫做 存取器 )。

其实,针对上述的代码,更加严格一点的话,不允许直接访问 data.name 属性,所有对 data.name 的读写都必须通过 data.getName() 和 data.setName() 方法。所以,想象一下,一旦某个属性不允许对其进行直接读写,而必须是通过访问器进行读写时,那么我当然通过重写属性的访问器方法来做一些额外的情,比如属性值变更监控。使用属性访问器来做数据双向绑定的原理就是在此。

使用Object.defineProperty实现简单的js双向绑定(使用的拼音)

这种方法当然也有弊端,最突出的就是每添加一个属性监控,都必须为这个属性添加对应访问器方法,否则这个属性的变更就无法捕获。

Object.defineProperty 方法

国产mvvm框架avalon.js实现数据双向绑定的原理就是属性访问器。不过它当然不会像上述示例代码一样原始。它使用了ECMAScript5.1(ECMA-)中定义的标准属性 Object.defineProperty 方法。针对国内行情,部分还不支持 Object.defineProperty 低级浏览器采用VBScript作了完美兼容,不像其他的mvvm框架已经逐渐放弃对低端浏览器的支持。

我们先来MDN上对 Object.defineProperty 方法的定义,

The Object.defineProperty() method defines a new property directly on an object, or modifies an existing property on an object, and returns the object.

意义很明确, Object.defineProperty 方法提供了一种直接的方式来定义对象属性或者修改已有对象属性。其方法原型如下,

其中,

obj ,待修改的对象prop ,带修改的属性名称descriptor ,待修改属性的相关描述descriptor 要求传入一个对象,其默认值如下,

configurable ,属性是否可配置。可配置的含义包括:是否可以删除属性( delete ),是否可以修改属性的 writable 、 enumerable 、 configurable 属性。

enumerable ,属性是否可枚举。可枚举的含义包括:是否可以通过 for...in 遍历到,是否可以通过 Object.keys() 方法获取属性名称。

writable ,属性是否可重写。可重写的含义包括:是否可以对属性进行重新赋值。

value ,属性的默认值。

set ,属性的重写器(暂且这么叫)。一旦属性被重新赋值,此方法被自动调用。

get ,属性的读取器(暂且这么叫)。一旦属性被访问读取,此方法被自动调用。

下面来一段示例代码,

经过上述的示例,正常情况下 Object.definePropert() 的使用都是比较简单的。

不过还是有一点需要额外注意一下, Object.defineProperty() 方法设置属性时,属性不能同时声明访问器属性( set 和 get )和 writable 或者 value 属性。 意思就是,某个属性设置了 writable 或者 value 属性,那么这个属性就不能声明 get 和 set 了,反之亦然。

因为 Object.defineProperty() 在声明一个属性时,不允许同一个属性出现两种以上存取访问控制。

示例代码,

上面的代码看起来貌似是没有什么问题,但是真正执行时会报错,报错如下,

因为这里的 name 属性同时声明了 value 特性和 set 及 get 特性,这两者提供了两种对 name 属性的读写控制。这里如果不声明 value 特性,而是声明 writable 特性,结果也是一样的,同样会报错。

基于javascript实现图片切换效果 本文实例为大家分享了js实现图片切换效果,供大家参考,具体内容如下用js实现点击按钮,图片切换的效果:divclass="box"id="box"divclass="img_box"id="img_box"img

js如何准确获取当前页面url网址信息 在WEB开发中,时常会用到javascript来获取当前页面的url网址信息,在这里是我的一些获取url信息的小总结。下面我们举例一个URL,然后获得它的各个组成

理解javascript对象继承 先从一个问题进行研究深入,什么是javascript对象继承?比如我们有一个动物对象的构造函数。functionanimal(){this.type='动物';}还有一个猫对象的构造函数。

标签: 使用的拼音

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

上一篇:在Html中使用Requirejs进行模块化开发实例详解

下一篇:基于javascript实现图片切换效果(javascript例题)

  • 新公司个税申报怎么操作
  • 车船使用税怎么网上缴费
  • 如何确定固定资产的原始价值
  • 发票作废后对方不退回抵扣联怎么办
  • 发票打印格式错误
  • 培训机构给学员过生日
  • 转让不动产增值税计算
  • 施工单位名称变更需要变施工许可证吗
  • 金税三期社保费管理客户端v1.0.088(生产环境)
  • 减免税费期末如何结转
  • 收到微信公众号退款怎么做账
  • 商城退换货
  • 企业计提短期借款利息费用应贷记的会计科目是
  • 基本存款账户能向银行借款吗
  • 开发票具体内容超过经营范围还可以开吗?
  • 实习生需要缴纳个税吗?
  • 代扣代缴手续费企业所得税
  • 企业开普票和专票的税率一样吗
  • 个体户发票冲红应该具备什么条件
  • 餐费发票怎么开
  • 暂停水电
  • 机械租赁有什么机械
  • 贴现利息计算器
  • 劳务费和工资薪金合并计算个人所得税合适吗
  • 鸿蒙3.0系统哪些手机可以升级
  • Win10 Build 19043(21H1最新版)即将推送 更新内容汇总
  • 仓库库存周转率高
  • 期末增值税进项税大于销项税的金额计入哪里
  • 新税法中工资薪金的规定
  • 王者荣耀中甄姬的cp是谁
  • h5实现扫码功能
  • 税务局返还的手续费需开发票吗
  • 电商快递费怎么做账
  • PHP:pg_lo_seek()的用法_PostgreSQL函数
  • 暂估入库结转成本账务处理
  • 计提折旧和计提减值
  • 销售自己2008年1月购入并作为
  • 最早的手机是哪一年
  • 不符合政策和条件的成语
  • ubuntu端口不能远程访问
  • 生育津贴的钱怎么取出来
  • 支付宝对公账户怎么转账
  • mysqljoin和where哪个好
  • 现金管理的四个方面
  • 生产型企业如何退税
  • 现金销售收入是什么意思
  • 罚款可以直接在12123
  • 出口货物赠品如何申报
  • 分公司财务负责人要求
  • 申报企业所得税会计分录怎么写
  • 对公账户转到个体工商户
  • 月末结转的各类凭证无需注意先后顺序
  • 劳务派遣的工资是谁发的
  • 销项负数发票入账分录
  • 应收未收的款项如何会计处理
  • 营改增后的增值税税目税率表
  • 信息服务费可以抵扣吗
  • 费用报销单如何审核
  • 专用发票怎么网上申领
  • 事业单位预收账款
  • 发票金额大于付款金额可以报销吗
  • 新成立的公司购买的家具可以计入主营业务成本吗
  • 利润分配的借方表示增加还是减少
  • IN&EXISTS与NOT IN&NOT EXISTS 的优化原则小结
  • win8.1使用技巧
  • linux awk排序
  • win10电脑打开图片文件夹会跳闪
  • win7桌面壁纸自动更换关闭
  • scrollpane.setviewportview
  • bootstrap页面代码
  • Cocos2dx -lua QuickXDev拓展
  • js 图片加载
  • 批处理解约瑟夫环应用题代码
  • node中异步编程模式使用什么捕获异常
  • js实现继承的几种方式详述(推荐)
  • 国家税务总局2018年61号公告
  • 智云发票集中管理云平台官网
  • 南昌契税政策
  • 购买税控盘的发票需要交印花税吗?
  • 苏州虎丘区税务局在哪里
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设