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 相关文章推荐
window.addeventjs事件驱动函数集合addEvent等
Feb 19 Javascript
jQuery ui1.7 dialog只能弹出一次问题
Aug 27 Javascript
Jquery刷新页面背景图片随机变换的实现方法
Mar 15 Javascript
把input初始值不写value的具体实现方法
Jul 04 Javascript
js实现页面a向页面b传参的方法
May 29 Javascript
jquery延迟对象解析
Oct 26 Javascript
js仿百度音乐全选操作
Jan 13 Javascript
无循环 JavaScript(map、reduce、filter和find)
Apr 08 Javascript
微信小程序 开发之全局配置
May 05 Javascript
基于hover的用法实例(推荐)
Jul 04 Javascript
Vue.js2.0中的变化小结
Oct 24 Javascript
小程序input数据双向绑定实现方法
Oct 17 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
Ajax+PHP 边学边练 之二 实例
2009/11/24 PHP
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
js图片自动切换效果处理代码
2013/05/07 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
js实现div的切换特效上一个下一个
2014/02/11 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
javascript自定义的addClass()方法
2014/05/28 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
js实现仿购物车加减效果
2017/03/01 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
图解javascript作用域链
2019/05/27 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
js页面加载后执行的几种方式小结
2020/01/30 Javascript
详细分析JavaScript中的深浅拷贝
2020/09/17 Javascript
Python实现随机选择元素功能
2017/09/14 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
pyspark给dataframe增加新的一列的实现示例
2020/04/24 Python
canvas实现滑动验证的实现示例
2020/08/11 HTML / CSS
护士个人简历自荐信
2013/10/18 职场文书
《那片绿绿的爬山虎》教学反思
2014/02/27 职场文书
网络管理员岗位职责
2014/03/17 职场文书
竞聘书怎么写,如何写?
2014/03/31 职场文书
教师求职信范文
2014/05/24 职场文书
美术兴趣小组活动总结
2014/07/07 职场文书
建筑施工安全责任书
2014/07/24 职场文书
商务英语求职信范文
2015/03/19 职场文书
民间借贷纠纷案件代理词
2015/05/26 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript