
vue源码分析(observe篇)
发布日期:2021-05-07 14:49:15
浏览次数:10
分类:原创文章
本文共 2169 字,大约阅读时间需要 7 分钟。
function Observer(data) { this.data = data; //暂存data this.walk(data);}Observer.prototype = { walk: function(data) { var me = this;//暂存this Object.keys(data).forEach(function(key) { //对data里所有的属性名进行遍历 me.convert(key, data[key]); }); }, convert: function(key, val) { this.defineReactive(this.data, key, val); }, defineReactive: function(data, key, val) { var dep = new Dep(); //为data中所有属性都创建一个dep实例 var childObj = observe(val); //递归遍历data中所有层次的属性 //为原有属性新增get和set方法(数据劫持) Object.defineProperty(data, key, { enumerable: true, // 是否可枚举 configurable: false, // 是否可重写 get: function() { //get方法 //判断当前Dep.target的watcher是否存在 if (Dep.target) {//当模版初始化的时候会赋值watcher实例到target上 //调用dep的depend方法 dep.depend(); } return val; }, set: function(newVal) { if (newVal === val) { return; } val = newVal; childObj = observe(newVal); // 通知订阅者 dep.notify(); } }); }};function observe(value, vm) { //判断value是否存在或者value的数据类型是否为object(递归的终止条件) if (!value || typeof value !== 'object') { return; } return new Observer(value); //返回数据劫持};var uid = 0; //定义一个uidfunction Dep() { this.id = uid++; //自增,每创建一个dep增加一个单独标识 this.subs = []; //watcher}Dep.prototype = { addSub: function(sub) { this.subs.push(sub); }, //调用watcher实例的addDep方法 depend: function() { //Dep.target此时是watcher的实例 //this此时是当前dep的实例 Dep.target.addDep(this); }, removeSub: function(sub) { var index = this.subs.indexOf(sub); if (index != -1) {//判断元素是否存在 this.subs.splice(index, 1); //截取 } }, //通知所有的watcher notify: function() { // beforeUpdate //遍历subs中所有的watcher的实例 this.subs.forEach(function(sub) { //每个watcher实例都会调用update方法 sub.update(); }); // updated }};Dep.target = null; //赋空
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月19日 17时55分24秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Python+Opencv识别视频统计人数
2019-03-04
python 记录下Python开发环境的安装配置
2019-03-04
大佬龟叔写的一个无聊程序
2019-03-04
linux 下安装kolla报错 提示Cannot uninstall requests
2019-03-04
Linux MySQL的socket文件存在位置更改
2019-03-04
Linux RPM和yum命令的使用技巧
2019-03-04
写博客常用的字体颜色(待续)
2019-03-04
C++ throw、try、catch、noexcept
2019-03-04
vim之vim滚屏与跳转
2019-03-04
C指针之函数指针与typedef
2019-03-04
CentOS8 字体大小调整
2019-03-04
Go 小数类型/浮点型的使用
2019-03-04
设计模式之组合模式
2019-03-04
设计模式之外观模式
2019-03-04
Linux 验证、数字证书、RPM包中文件的提取
2019-03-04
《Redis开发与运维》阅读笔记:键管理之单个键管理
2019-03-04
(HTML学习记录):列表标签
2019-03-04
(CMake):指定标准进行编译、CMake官方文档查看
2019-03-04