- 1.7 自带资源选项合并
1.7 自带资源选项合并
在1.2中我们看到了Vue默认会带几个选项,分别是components组件, directive指令, filter过滤器,所有无论是根实例,还是父子实例,都需要和系统自带的资源选项进行合并。它的定义如下:
// 资源选项var ASSET_TYPES = ['component','directive','filter'];// 定义资源合并的策略ASSET_TYPES.forEach(function (type) {strats[type + 's'] = mergeAssets; // 定义默认策略});
这些资源选项的合并逻辑很简单,首先会创建一个原型指向父类资源选项的空对象,再将子类选项赋值给空对象。
// 资源选项自定义合并策略function mergeAssets (parentVal,childVal,vm,key) {var res = Object.create(parentVal || null); // 创建一个空对象,其原型指向父类的资源选项。if (childVal) {assertObjectType(key, childVal, vm); // components,filters,directives选项必须为对象return extend(res, childVal) // 子类选项赋值给空对象} else {return res}}
结合下面的例子,我们看具体合并后的结果:
var vm = new Vue({components: {componentA: {}},directives: {'v-boom': {}}})console.log(vm.$options.components)// 根实例的选项和资源默认选项合并后的结果{components: {componentA: {},__proto__: {KeepAlive: {}Transition: {}TransitionGroup: {}}},directives: {'v-boom': {},__proto__: {'v-show': {},'v-model': {}}}}
简单总结一下,对于 directives、filters 以及 components 等资源选项,父类选项将以原型链的形式被处理。子类必须通过原型链才能查找并使用内置组件和内置指令。
