Vue源码解析之Object侦测1——Observer

源码解析侦测变化Object的变化侦测功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入#mermaid-svg-Akp490RXUgu61uoX .label{font-family:'trebuchet ms', verdana
摘要由CSDN通过智能技术生成

Vue 中Observer、Dep、Watcher的关系图
在这里插入图片描述

  • 使Object变为可观测的对象——通过Object.definedPrototype()为数据对象添加get和set属性,实现数据劫持;
  • 那么数据在改变的时候就会通过setter通知依赖他的视图,这里我们需要先收集数据有哪些依赖,这个收集的动作是在getter中进行的;
  • 收集的依赖需要一个管理器去管理他们,此时就出现了Dep类;
  • 在Dep中我们有depend()收集依赖,然后有nofiy()通知对应的依赖进行更新;
  • 我们为这个依赖创建Watcher实例,当外界通过Watcher获取数据的时候会触发getter,此时会将当前的Watcher实例添加到dep的subs(即存放依赖的数组)数组中;
  • 当数据放生变化时,会触发setter,向Dep发送notify,然后Dep中会调用Watcher中的更新操作;
  • Watcher接收到通知后,会向外界发送通知,变化通知到外界后可能会触发视图更新,也有可能触发用户的某个回调函数等。

begin

Object.defineProperty——简单例子

首先要了解一下Object.defineProperty的相关知识
Object.defineProperty()详解请戳我

var person = {
   }
       Object.defineProperty(person,'name',{
   
           configurable:false,//能否使用delete、能否需改属性特性、或能否修改访问器属性、,false为不可重新定义,默认值为true
           enumerable:false,//对象属性是否可通过for-in循环,flase为不可循环,默认值为true
           writable:false,//对象属性是否可修改,flase为不可修改,默认值为true
           value:'xiaoming' //对象属性的默认值,默认值为undefined 
        });

通过Object.defineProperty将一个对象转换为可以观测的示例
const cat = {
   };
let alike = 'fish';
Object.defineProperty(cat, 'like', {
   
  get() {
   
    console.log('触发了get方法');
    return alike;
  },
  set(val) {
   
    alike = val;
    console.log('触发了set方法');
  },
});
console.log(cat.like);
cat.like = 'mouse';
console.log(cat.like);

//输出的结果如下
触发了get方法
fish
触发了set方法
触发了get方法
mouse

接下来看一下vue源码中怎么将object转化为一个可观测的object

源码路径src/core/observer/index.js

Oberver类

  • Observer类会通过递归的方式把一个对象的所有属性都转化成可观测对象
  • <
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值