vue源码学习之Object.defineProperty对象属性监听


Posted in Javascript onMay 30, 2018

本文介绍了vue源码学习之Object.defineProperty对象属性监听,分享给大家,具体如下:

参考版本 vue源码版本:0.11

相关

vue实现双向数据绑定的关键是 Object.defineProperty ,让我们先来看下这个函数。

在MDN上查看有关Object.defineProperty 的解释。

我们先从最简单的开始:

let a = {'b': 1};
Object.defineProperty(a, 'b', {
  enumerable: false,
  configurable: false,
  get: function(){
    console.log('b' + '被访问');
  },
  set: function(newVal){
    console.log('b' + '被修改,新' + 'b' + '=' + newVal);
  }
});

a.b = 2;  // b被修改,新b=2
a.b;    // b被访问

这样,我们就能监听对象了!但问题并不仅仅这么简单。。。

我们可能会有对象中属性的值还是对象这种嵌套情况,可以通过递归解决!

在vue源代码文件 srcobserveobserver.js 中

// 观察者构造函数
function Observer(data){
  this.data = data;
  this.walk(data);
}

let p = Observer.prototype;
p.walk = function(obj){
  let val;
  for(let key in obj){
    // 通过 hasOwnProperty 过滤掉一个对象本身拥有的属性 
    if(obj.hasOwnProperty(key)){
      val = obj[key];
      // 递归调用 循环所有对象出来
      if(typeof val === 'object'){
        new Observer(val);
      }
      this.convert(key, val);
    }
  }
};

p.convert = function(key, val){
  Object.defineProperty(this.data, key, {
    enumerable: false,
    configurable: false,
    get: function(){
      console.log(key + '被访问');
    },
    set: function(newVal){
      console.log(key + '被修改,新' + key + '=' + newVal);
      if(newVal === val) return ;
      val = newVal;
    }
  })
};

let data = {
  user: {
    name: 'zhangsan',
    age: 14
  },
  address: {
    city: 'beijing'
  }
}

let app = new Observer(data);
data.user.name;  // user被访问

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

Javascript 相关文章推荐
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
Jun 28 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
Feb 26 Javascript
jQuery中slideUp()方法用法分析
Dec 24 Javascript
AngularJs表单校验功能实例代码
Feb 09 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
Dec 28 Javascript
动态加载、移除js/css文件的示例代码
Mar 20 Javascript
vue 权限认证token的实现方法
Jul 17 Javascript
vue项目打包部署到服务器的方法示例
Aug 27 Javascript
JS实现将对象转化为数组的方法分析
Jan 21 Javascript
详解基于原生JS验证表单组件xy-form
Aug 20 Javascript
layui 地区三级联动 form select 渲染的实例
Sep 27 Javascript
vue 中固定导航栏的实例代码
Nov 01 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
May 30 #Javascript
微信小程序实现跑马灯效果完整代码(附效果图)
May 30 #Javascript
vue通过点击事件读取音频文件的方法
May 30 #Javascript
vue 表单输入格式化中文输入法异常问题
May 30 #Javascript
详解如何使用babel进行es6文件的编译
May 29 #Javascript
基于打包工具Webpack进行项目开发实例
May 29 #Javascript
JavaScript反射与依赖注入实例详解
May 29 #Javascript
You might like
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
2014/11/20 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
2015/03/19 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
MSN消息提示类
2006/09/05 Javascript
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
JS远程获取网页源代码实例
2013/09/05 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
javascript + jquery实现定时修改文章标题
2014/03/19 Javascript
JQuery替换DOM节点的方法
2015/06/11 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
Bootstrap 布局组件(全)
2016/07/18 Javascript
JavaScript中的await/async的作用和用法
2016/10/31 Javascript
easyui取消表单实时验证,提交时统一验证的简单实例
2016/11/07 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
JS实现给对象动态添加属性的方法
2017/01/05 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
javascript 删除数组元素和清空数组的简单方法
2017/02/24 Javascript
微信小程序登录态和检验注册过没的app.js写法
2019/05/22 Javascript
Python实现图片滑动式验证识别方法
2017/11/09 Python
python3获取url文件大小示例代码
2019/09/18 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
如何用python免费看美剧
2020/08/11 Python
Python调用飞书发送消息的示例
2020/11/10 Python
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
Mistine官方海外旗舰店:泰国国民彩妆品牌
2016/12/28 全球购物
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
淘宝网店营销策划书
2014/01/11 职场文书
秋季婚礼证婚词
2014/01/11 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
党委书记个人对照检查材料
2014/09/15 职场文书
水电施工员岗位职责
2015/04/11 职场文书