最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

vue源码学习之Object.defineProperty对象属性监听

来源:懂视网 责编:小采 时间:2020-11-27 22:13:45
文档

vue源码学习之Object.defineProperty对象属性监听

vue源码学习之Object.defineProperty对象属性监听:本文介绍了vue源码学习之Object.defineProperty对象属性监听,分享给大家,具体如下: 参考版本 vue源码版本:0.11 相关 vue实现双向数据绑定的关键是 Object.defineProperty ,让我们先来看下这个函数。 在MDN上查看有关Object.defineP
推荐度:
导读vue源码学习之Object.defineProperty对象属性监听:本文介绍了vue源码学习之Object.defineProperty对象属性监听,分享给大家,具体如下: 参考版本 vue源码版本:0.11 相关 vue实现双向数据绑定的关键是 Object.defineProperty ,让我们先来看下这个函数。 在MDN上查看有关Object.defineP

本文介绍了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被访问 

文档

vue源码学习之Object.defineProperty对象属性监听

vue源码学习之Object.defineProperty对象属性监听:本文介绍了vue源码学习之Object.defineProperty对象属性监听,分享给大家,具体如下: 参考版本 vue源码版本:0.11 相关 vue实现双向数据绑定的关键是 Object.defineProperty ,让我们先来看下这个函数。 在MDN上查看有关Object.defineP
推荐度:
标签: 对象 监听 vue源码
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top