vue源码学习之Object.defineProperty对象属性监听
更新时间:2018年05月30日 09:47:19 作者:iiijarvis
这篇文章主要介绍了vue源码学习之Object.defineProperty对象属性监听,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本文介绍了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被访问
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
vue3+vite自定义封装vue组件发布到npm包的全过程
当市面上主流的组件库不能满足我们业务需求的时候,那么我们就有必要开发一套属于自己团队的组件库,下面这篇文章主要给大家介绍了关于vue3+vite自定义封装vue组件发布到npm包的相关资料,需要的朋友可以参考下2022-09-09
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
这篇文章主要介绍了基于vue-cli、elementUI的Vue超简单入门小例子,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-04-04


最新评论