stateMixin这是什么东西!
欢迎大家来到大魔王(老陈博客),跳过那些浮夸的介绍,毕竟vue源码是保存在硬盘里的数据,想要手撕vue源码需要足够大的手劲儿能够撕碎硬盘,duck不必duck不必~~,咱们就细细品尝,细细阅读这个vue,了解vue的架构思维
stateMixin恐怖如斯恐怖如斯!嘶~~~~嗝~~啊~爽!:)
本来在这个地方我应该直入主题,介绍什么是stateMixin了对不对,你们也是这么想的,如果你们这么想就大错特错了,先保持一个悬念,我们先了解stateMixin这个function做了什么事情,最后再去总结stateMixin是什么东西
intance/state.js
首先我们可以从intance/index.js文件中可以看到,stateMixin是从state.js文件中暴露出来的
那么我们就打开这个文件瞅一瞅,看一看,不看不知道一看吓一跳,赫赫有名的state只有短短几十行代码,满打满算五十行!你没有听错,只需要了解这五十行代码你就可以带走他!走过路过千万不要错过!这个函数还有三行是注释,告诉我们“在使用object.defineProperty时,流在直接声明的definition对象方面存在一些问题,因此我们必须在这里按程序构建对象。”
函数内部首先是定义了两个对象dataDef和propsDef,都赋值了{},然后在原型去添加了set和get方法,禁止对dataDef和propsDef进行set赋值操作,并且set时会报错,dataDef的get方法是获取到this._data,propsDef的get返回的是this._props,然后将这两个变量通过对象方法Object.definePropoty添加到vue原型上 扩展知识1⃣️
observe/index.js
再下面是对于原型链上的set进行赋值,赋值的变量函数来自于observe/index.js文件中暴露出来的set方法和del方法
set、del
set方法接受对象target可以是对象,也可以是数组,首先判断target是否为数组,如果是数组,就是对于数组下标进行操作,调用的方法是splice,也就是vue2.0中数组上的变异方法之一,将修改的值返回,如果是对象会深一层的判断该key是否存在在Object的原型上,只会对传入进来target对象上的属性进行操作,。。。。。。在这边写字没有代码支持略微有点空洞,不如在源码上写注释粘贴过来:)
通过这个板块介绍set和delete的实现方式和接受参数target的格式可以发现,delete都是可以对数组进行操作的,good!
instence/index.js
不多了,只剩最后一个$watch实例方法,接收参数个数中规中矩,这个方法中实现逻辑我多多少少还要去印证一下。。。第一个参数可以是一个函数(有返回字符串那种吗??缓缓打一个问号)
首先,我们先知道一个createWatcher方法的实现
observe/watcher.js
其次,我们接触到了vue的核心代码,实现了数据驱动,实现了发布者/订阅者模式的核心watcher,是使用class类实现的对象,整个文件有两百多行,不算多,但是不是本篇博客的核心内容,我会单独出一期watcher的实现来讲,现在要看的是一会儿会用到的watcher的一个teardown方法
初始化watcher会判断是否为renderwatcher,如果不是就是在vm._watchers上添加这个watcher
teardown方法为了删除该watcher对象
instence/index.js
最后总结$watch方法
最后的最后再提起博客最前说起的stateMixin做了什么事情,就是初始化原型上的delete和$watch实例方法,奶思~
扩展知识
扩展知识1⃣️
直接赋值空对象,变量是有原型的,使用Object.create(null)创建出来的对象是没有原型的