浅谈vue实现数据监听的函数 Object.defineProperty


Posted in Javascript onJune 08, 2017

在 ES5中新增了不少新的API, 例如  新增了 Object.xxx相关的方法,其中有一个定义属性相关的 Object.defineProperty 这个方法(还有Object.defineProperties)这个方法是 vue框架实现数据监听的核心方法,它的定义如下:

Object.defineProperty([Object] obj, [String] propname, [Object] desp )

  1. @param  obj  要配置属性的某个对象
  2. @param propname 要配置的属性名,是一个字符串
  3. @param desp 对属性的描述,是一个对象,

desp 中可以配置的项目 

<1> writable:  true/false 是否可写

<2> configurable : true/false 是否可以配置,例如删除该属性

<3> enumerable: true/false 指的是是否可以使用 for in循环遍历属性

<4> value:  值  ,属性的值

我们在写vue项目的时候会在 data属性中添加我们自己的属性,这个属性在vue中是响应式的,也就是它可以监听到数据的变化,做出相应的改变(例如DOM操作)

我们自己利用 defineProperty给属性生成setter和getter(也就是其他编程语言里的存取器),就可以达到监听数据变化的目的

下面我们来自己实现一个数据监听的小 demo

有如下的数据

let vue = {
   data: {
    title: 'life style',
    content: 'bike walk sleep...'
   }
  };

已经提前声明的 data属性及其内部的属性,我们的目标是监听 data中,title和content的变化

如何做到呢? 属性的个数是不确定的,所以我们可以使用 for in循环遍历data对象的所有的属性

//如何监听用户自定义的 data中属性的改变?
  let data = vue.data;
  for (let prop in data) {
   data['__' + prop] = data[prop]; //存储私有属性
   Object.defineProperty(data, prop, {
    enumerable : true,
    set: function (newVal) {
     console.log('你正在修改'+prop + ' !...操作DOM...');
     // 数据校验
     this['__' + prop] = newVal;
    },
    get: function () {
     console.log('getter 获取值 ...');
     return this['__' + prop];
    }
   });
  }

遍历data属性的时候调用 defineProperty来给data对象的属性添加set和get方法,

我们给data添加一个新的属性   __xxx来保存我们之前的值,以便在 get方法中获取原来的值

set方法 用于监听这个属性被重新赋值,

get方法用于获取你想要的格式的值

此处需要注意的是 不要在 set和get中 使用this赋值或者取值,这样会导致循环调用,出现问题!!!

另外 我们不要使用 var,而要使用 let ,因为var不是块作用域, 会导致你最后访问到的prop总是最后一个

定义好之后,我们可以修改 data中title和content属性了,

当我们给 title赋值的时候回自动调用 set, 获取值得时候自动调用get

测试代码

// 赋值操作会调用这个属性的set方法, 类似于 set('aaa')
  data.title = 'aaa';
  // 获取值操作会调用这个属性的get方法
  console.log(data.title);
  data.content = 123;
  // 此种动态属性方式也会触发 set / get
  data['title'] = 123;
  console.log(data['title']);

结果(建议在最新版的chrome中操作):

浅谈vue实现数据监听的函数 Object.defineProperty

对刚刚的遍历方法还存在一些问题和说明:

1.data属性的某个属性可能还是对象,也就是存在多层级对象监听的问题

此时可以使用递归函数遍历data的属性,进行相同操作

2. 通过  data.title = 1是实际上是调用了 set方法, 这个类似于 OC中的点语法

3. 要同时定义多个属性,可以使用

Object.defineProperties([Object] obj, [Object] props);

需要注意的是, 本文只是介绍 defineProperty的基本使用,并非代表vue的代码实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
认识延迟时间为0的setTimeout
May 16 Javascript
Javascript attachEvent传递参数的办法
Dec 14 Javascript
qTip2 精致的基于jQuery提示信息插件
Feb 17 Javascript
jQuery实现当按下回车键时绑定点击事件
Jan 28 Javascript
JavaScript拆分字符串时产生空字符的解决方案
Sep 26 Javascript
jquery实现的3D旋转木马特效代码分享
Aug 25 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
Nov 02 Javascript
Windows下Node.js安装及环境配置方法
Sep 18 Javascript
node+koa实现数据mock接口的方法
Sep 20 Javascript
微信小程序实现跑马灯效果
Oct 21 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
Dec 13 Javascript
微信小程序实现原生步骤条
Jul 25 Javascript
jQuery Validate表单验证插件实现代码
Jun 08 #jQuery
浅谈 Vue v-model指令的实现原理
Jun 08 #Javascript
Vue如何实现组件的源码解析
Jun 08 #Javascript
jquery Ajax实现Select动态添加数据
Jun 08 #jQuery
js canvas实现放大镜查看图片功能
Jun 08 #Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
Jun 08 #Javascript
微信小程序开发之map地图实现教程
Jun 08 #Javascript
You might like
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
php-msf源码详解
2017/12/25 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
2019/05/05 PHP
thinkPHP和onethink微信支付插件分享
2019/08/11 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
Mootools 1.2教程 输入过滤第二部分(字符串)
2009/09/15 Javascript
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
jQuery+easyui中的combobox实现下拉框特效
2015/02/27 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
完美解决axios在ie下的兼容性问题
2018/03/05 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
[01:02:26]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第二场 1月18日
2021/03/11 DOTA
python调用tcpdump抓包过滤的方法
2018/07/18 Python
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
数控专业个人求职信范文
2014/02/05 职场文书
领导党性分析材料
2014/02/15 职场文书
房产代理公证处委托书
2014/04/04 职场文书
银行委托书范本
2014/04/04 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
优秀党支部申报材料
2014/12/24 职场文书
出国留学自荐信模板
2015/03/06 职场文书
优秀教师主要事迹材料
2015/11/04 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
微软PC Health Check电脑健康状况检查应用下载(Win11配置检测工具)
2021/06/26 数码科技
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle