研究vue2.0源码(2)stateMixin——core

687 阅读3分钟

stateMixin这是什么东西!

欢迎大家来到大魔王(老陈博客),跳过那些浮夸的介绍,毕竟vue源码是保存在硬盘里的数据,想要手撕vue源码需要足够大的手劲儿能够撕碎硬盘,duck不必duck不必~~,咱们就细细品尝,细细阅读这个vue,了解vue的架构思维

stateMixin恐怖如斯恐怖如斯!嘶~~~~嗝~~啊~爽!:)

image.png

本来在这个地方我应该直入主题,介绍什么是stateMixin了对不对,你们也是这么想的,如果你们这么想就大错特错了,先保持一个悬念,我们先了解stateMixin这个function做了什么事情,最后再去总结stateMixin是什么东西

intance/state.js

首先我们可以从intance/index.js文件中可以看到,stateMixin是从state.js文件中暴露出来的

image.png

那么我们就打开这个文件瞅一瞅,看一看,不看不知道一看吓一跳,赫赫有名的state只有短短几十行代码,满打满算五十行!你没有听错,只需要了解这五十行代码你就可以带走他!走过路过千万不要错过!这个函数还有三行是注释,告诉我们“在使用object.defineProperty时,流在直接声明的definition对象方面存在一些问题,因此我们必须在这里按程序构建对象。”

image.png

函数内部首先是定义了两个对象dataDef和propsDef,都赋值了{},然后在原型去添加了set和get方法,禁止对dataDef和propsDef进行set赋值操作,并且set时会报错,dataDef的get方法是获取到this._data,propsDef的get返回的是this._props,然后将这两个变量通过对象方法Object.definePropoty添加到vue原型上 扩展知识1⃣️

image.png

observe/index.js

再下面是对于原型链上的deletedelete和set进行赋值,赋值的变量函数来自于observe/index.js文件中暴露出来的set方法和del方法

set、del

set方法接受对象target可以是对象,也可以是数组,首先判断target是否为数组,如果是数组,就是对于数组下标进行操作,调用的方法是splice,也就是vue2.0中数组上的变异方法之一,将修改的值返回,如果是对象会深一层的判断该key是否存在在Object的原型上,只会对传入进来target对象上的属性进行操作,。。。。。。在这边写字没有代码支持略微有点空洞,不如在源码上写注释粘贴过来:)

image.png

image.png

通过这个板块介绍set和delete的实现方式和接受参数target的格式可以发现,setset和delete都是可以对数组进行操作的,good!

instence/index.js

不多了,只剩最后一个$watch实例方法,接收参数个数中规中矩,这个方法中实现逻辑我多多少少还要去印证一下。。。第一个参数可以是一个函数(有返回字符串那种吗??缓缓打一个问号)

首先,我们先知道一个createWatcher方法的实现

image.png

observe/watcher.js

其次,我们接触到了vue的核心代码,实现了数据驱动,实现了发布者/订阅者模式的核心watcher,是使用class类实现的对象,整个文件有两百多行,不算多,但是不是本篇博客的核心内容,我会单独出一期watcher的实现来讲,现在要看的是一会儿会用到的watcher的一个teardown方法

初始化watcher会判断是否为renderwatcher,如果不是就是在vm._watchers上添加这个watcher

teardown方法为了删除该watcher对象

image.png

instence/index.js

最后总结$watch方法

image.png

最后的最后再提起博客最前说起的stateMixin做了什么事情,就是初始化原型上的setset,delete和$watch实例方法,奶思~

image.png

扩展知识

扩展知识1⃣️

直接赋值空对象,变量是有原型的,使用Object.create(null)创建出来的对象是没有原型的

image.png