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 jsFiddle JSBin在线调试器
Mar 14 Javascript
使用jQuery模板来展现json数据的代码
Oct 22 Javascript
window.open不被拦截的实现代码
Aug 22 Javascript
理解Javascript闭包
Nov 01 Javascript
jquery实现checkbox 全选/全不选的通用写法
Feb 22 Javascript
javascript实现的图片切割多块效果实例
May 07 Javascript
JQuery给网页更换皮肤的方法
May 30 Javascript
轻松掌握JavaScript装饰者模式
Aug 27 Javascript
AngularJS中过滤器的使用与自定义实例代码
Sep 17 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
Sep 24 Javascript
AngularJS动态菜单操作指令
Apr 25 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
Apr 08 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
Terran兵种介绍
2020/03/14 星际争霸
如何将一个表单同时提交到两个地方处理
2006/10/09 PHP
php删除指定目录的方法
2015/04/03 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
用javascript实现无刷新更新数据的详细步骤 asp
2006/12/26 Javascript
jQuery 工具函数学习资料
2010/04/29 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
分析Node.js connect ECONNREFUSED错误
2013/04/09 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
javascript实现校验文件上传控件实例
2015/04/20 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
javascript实现在指定元素中垂直水平居中
2015/09/13 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
js图片放大镜实例讲解(必看篇)
2017/07/17 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
有关wxpython pyqt内存占用问题分析
2014/06/09 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
HTML5的标签的代码的简单介绍 HTML5标签的简介
2012/05/28 HTML / CSS
Perfume’s Club德国官网:在线购买香水
2019/04/08 全球购物
酷瑞网络科技面试题
2012/03/30 面试题
公司门卫的岗位职责
2014/02/19 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
关于springboot 配置date字段返回时间戳的问题
2021/07/25 Java/Android
pandas进行数据输入和输出的方法详解
2022/03/23 Python
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android