极乐门资源网 Design By www.ioogu.com
本文介绍了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被访问
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
极乐门资源网 Design By www.ioogu.com
极乐门资源网
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
极乐门资源网 Design By www.ioogu.com
暂无vue源码学习之Object.defineProperty对象属性监听的评论...
更新日志
2024年12月23日
2024年12月23日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]