博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vue源码学习:Object.defineProperty 对象属性监听
阅读量:7101 次
发布时间:2019-06-28

本文共 1512 字,大约阅读时间需要 5 分钟。

参考版本

相关

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

在MDN上查看有关 的解释。

我们先从最简单的开始:

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=2a.b; // b被访问复制代码

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

我们可能会有对象中属性的值还是对象这种嵌套情况,可以通过递归解决!
在vue源代码文件 src\observe\observer.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被访问 复制代码

转载于:https://juejin.im/post/5b0bd1f1f265da090204713d

你可能感兴趣的文章
JavaScript 变量、函数与原型链
查看>>
saltstack Key管理工具-salt-key
查看>>
WWDC19 -224-iOS 13 Presentations 适配
查看>>
Mybatis异常There is no getter for property named 'XXX' in 'class java.lang.String'
查看>>
jQuery初始化
查看>>
[转载]Linux内存高,触发oom-killer问题解决
查看>>
帮助小白快速理解多线程
查看>>
Android系统移植与驱动开发概述
查看>>
Codeforces 432D Prefixes and Suffixes kmp
查看>>
【poj解题】1028
查看>>
免费论文查重
查看>>
[转]gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解
查看>>
loadrunner web_custom_request 脚本处理
查看>>
【中文】Joomla1.7扩展介绍之Sitelinkx (自动链接)
查看>>
上下文菜单点击获取ContextMenu实例方法
查看>>
使用jmeter进行简单的压测
查看>>
创建逻辑卷
查看>>
C# bool? 的意思
查看>>
自定义UITableViewCell 的delete按钮
查看>>
NSLog格式化输出
查看>>