老师,您好。
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都定义了同样的方法名,那后者不应该是覆盖前者了吗?