strats.data = function (
parentVal: any,
childVal: any,
vm?: Component
): ?Function {
if (!vm) {
if (childVal && typeof childVal !== 'function') {
process.env.NODE_ENV !== 'production' && warn(
'The "data" option should be a function ' +
'that returns a per-instance value in component ' +
'definitions.',
vm
)
return parentVal
}
return mergeDataOrFn(parentVal, childVal)
}
return mergeDataOrFn(parentVal, childVal, vm)
}
export function mergeDataOrFn (
parentVal: any,
childVal: any,
vm?: Component
): ?Function {
if (!vm) {
// 如果没有传入vm
// in a Vue.extend merge, both should be functions,在 Vue.extend 的合并中,两个都应该是函数
// 子对象不存在返回父对象,父对象不存在返回子对象
if (!childVal) {
return parentVal
}
if (!parentVal) {
return childVal
}
// 如果childVal,parentVal都存在,返回一个函数 mergedDataFn
return function mergedDataFn () {
// 返回 合并函数
return mergeData(
typeof childVal === 'function' ? childVal.call(this, this) : childVal,
typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal
)
}
} else {
// 如果传入vm,返回函数 mergedInstanceDataFn
return function mergedInstanceDataFn () {
// 实例的合并
// 拿到 childVal 的值,如果是函数,执行它获取返回值,如果不是,直接返回 childVal
const instanceData = typeof childVal === 'function'
? childVal.call(vm, vm)
: childVal
// 同理拿到 parentVal 的值
const defaultData = typeof parentVal === 'function'
? parentVal.call(vm, vm)
: parentVal
// 如果 childVal 存在,则返回合并函数,否则直接返回 parentVal
if (instanceData) {
return mergeData(instanceData, defaultData)
} else {
return defaultData
}
}
}
}
// Helper that recursively merges two data objects together.
function mergeData (to: Object, from: ?Object): Object {
// 如果源对象不存,直接返回目标对象
if (!from) return to
// 定义三个变量
let key, toVal, fromVal
// 获取源对象from的所有key组成的数组keys
const keys = Object.keys(from)
// 遍历源对象from的所有key组成的数组
for (let i = 0; i < keys.length; i++) {
// 将源对象from的key赋值给变量 key
key = keys[i]
// 将源对象from的key作为目标对象to的key获取to对应的value,赋值给变量 toVal
toVal = to[key]
// 将源对象key对象的value赋值给变量 fromVal
fromVal = from[key]
if (!hasOwn(to, key)) {
// 如果目标对象to中,没有源对象from的key属性,
// 则,将源对象from上的key和对应的value,添加到目标对象to上
set(to, key, fromVal)
} else if (toVal !== fromVal && isPlainObject(toVal) && isPlainObject(fromVal) ) {
// 如果to[key],from[key]不相等,并且to[key],from[key]都是对象,
// 则,递归,合并to[key],from[key]对象
mergeData(toVal, fromVal)
}
}
// 返回合并后的目标对象 to
return to
}