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 相关文章推荐
javascript form 验证函数 弹出对话框形式
Jun 23 Javascript
php,js,css字符串截取的办法集锦
Sep 26 Javascript
JavaScript 动态加载脚本和样式的方法
Apr 13 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
Jan 19 Javascript
JavaScript jquery及AJAX小结
Jan 24 Javascript
jQuery可见性过滤选择器用法示例
Sep 09 Javascript
Bootstrap选项卡动态切换效果
Nov 28 Javascript
JS+jQuery实现注册信息的验证功能
Sep 26 jQuery
js原生日历的实例(推荐)
Oct 31 Javascript
详解如何更好的使用module vuex
Mar 27 Javascript
vue+element+Java实现批量删除功能
Apr 08 Javascript
three.js中多线程的使用及性能测试详解
Jan 07 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
东方红 - 来复式再生机的修复
2021/03/02 无线电
php数据入库前清理 注意php intval与mysql的int取值范围不同
2010/12/12 PHP
php导入csv文件碰到乱码问题的解决方法
2014/02/10 PHP
PhpDocumentor 2安装以及生成API文档的方法
2014/05/21 PHP
PHP中上传多个文件的表单设计例子
2014/11/19 PHP
php实现的SESSION类
2014/12/02 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
2016/10/25 PHP
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
通过js动态操作table(新增,删除相关列信息)
2012/05/23 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
JavaScript中this详解
2015/09/01 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
JS实现页面打印功能
2017/03/16 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
python之wxPython菜单使用详解
2014/09/28 Python
Python实现计算最小编辑距离
2016/03/17 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
Python交互环境下实现输入代码
2018/06/22 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
HTML5 用动画的表现形式装载图像
2016/03/08 HTML / CSS
写给女朋友的检讨书
2014/01/28 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
交通事故委托书范本
2014/09/28 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
家长学校教学计划
2015/01/19 职场文书
2019年手机市场的调研报告2篇
2019/10/10 职场文书
MySQL面试题讲解之如何设置Hash索引
2021/11/01 MySQL