请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于合并配置的一个问题

老师,您好。
mergerOptions的最终目标不是将extends和mixins上的写好的选项与Vue.options再与我们手写的其他选项进行合并,然后得到一个完整的options去作为Vue.prototype._init的基础数据进一步初始化么?这样我们就需要确定一个配置覆盖的优先级。事实上应该是我们在new Vue({})的{}中定义的内容会覆盖掉extends上的相同内容的吧?

可是从源码上看,在mergeOptions中,第一次带入的parent是Vue.options。之后会递归调用mergeOptions去让Vue.options和child.extends上的内容进行合并,最后得到一个新的parent。然后会创建一个新的空对象{},再逐键遍历parent,为parent上的内容都融合到这个新的空对象{}中,可是在遍历child的时候,它是通过if(!hasOwn(parent, key))来进行判断的,这样的话child上定义的选项如果在parent上存在了就不会进行任何合并,因为此时(!hasOwn)应该返回的是false,而后面也没有else的逻辑。所以也就是说parent上的东西会覆盖掉child上的东西。这样的话不是覆盖的优先级倒置了么?

那这样的话,假如extends中的某个选项,比如methods和在new Vue({})的{}中写入的methods都定义了同样的方法名,那后者不应该是覆盖前者了吗?

正在回答 回答被采纳积分+3

1回答

ustbhuangyi 2019-06-27 12:26:37

首先,extends 和 mixins 合并效果是一致的。

其次,你的理解有问题。
for (key in parent) {
 mergeField(key)
}
for (key in child) {
 if (!hasOwn(parent, key)) {
   mergeField(key)
 }
}
这 2 段的代码的意思是为了让 parent 和 child 上的所有 key 都能遍历到,执行 mergeField,mergeField 函数中才是做真正的合并。

最后,不同属性的合并策略是不一样的。

function mergeField (key) {
 const strat = strats[key] || defaultStrat
 options[key] = strat(parent[key], child[key], vm, key)
}
它会根据 key 获取到不同的合并策略 strat 函数,然后做合并,至于不同属性的具体合并策略,你需要去看相应的合并函数了。这也是经典的策略模式的应用场景。

3 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信