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 Lightbox 图片展示插件使用说明
Apr 25 Javascript
Node.js 异步编程之 Callback介绍(一)
Mar 30 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
May 07 Javascript
详解jQuery中的元素的属性和相关操作
Aug 14 Javascript
canvas学习之API整理笔记(一)
Dec 29 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
Feb 22 Javascript
面试常见的js算法题
Mar 23 Javascript
javascript 取小数点后几位几种方法总结
Aug 02 Javascript
基于datepicker定义自己的angular时间组件的示例
Mar 14 Javascript
理顺8个版本vue的区别(小结)
Sep 17 Javascript
Javascript查看大图功能代码实现
May 07 Javascript
绘制微信小程序验证码功能的实例代码
Jan 05 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
Smarty安装配置方法
2008/04/10 PHP
php简单防盗链实现方法
2015/07/29 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
php字符串操作常见问题小结
2016/10/11 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
2017/10/25 PHP
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
jQuery基于json与cookie实现购物车的方法
2016/04/15 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
js实现全选和全不选
2020/07/28 Javascript
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
python中count函数简单用法
2020/01/05 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
使用HTML5进行SVG矢量图形绘制的入门教程
2016/02/19 HTML / CSS
巴西网上药店:Drogaria Araujo
2021/01/06 全球购物
自荐书模板
2013/12/19 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
劳模事迹材料范文
2014/12/24 职场文书
顶岗实习计划书
2015/01/16 职场文书
收费员岗位职责
2015/02/14 职场文书
2015暑假社会调查报告
2015/07/13 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
五一放假通知怎么写
2015/08/18 职场文书
2019年大学推荐信
2019/06/24 职场文书
详解CSS伪元素的妙用单标签之美
2021/05/25 HTML / CSS