抽象一个参数扩展库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import { type } from '@jslib-book/type'
import { clone } from '@jslib-book/clone'

function hasOwnProp(obj, key) {
return Object.prototype.hasOwnProperty.call(obj, key)
}

export function extend(defaultOpt, customOpt) {
defaultOpt = clone(defaultOpt) // 拷贝一份defaultOpt,隔离数据

for (let name in customOpt) {
const src = defaultOpt[name]
const copy = customOpt[name]

// 非可枚举属性 直接停止
if (!hasOwnProp(customOpt, name)) {
continue
}

if (copy && type(copy) === 'object') {
// 如果default上不存在值时,会自动创建空对象
const clone = src && type(src) === 'object' ? src : {}
// 递归合并
defaultOpt[name] = extend(clone, copy)
} else if (typeof copy !== 'undefined'){
// 非对象类型且值不为undefined的时候
defaultOpt[name] = copy
}
}
return defaultOpt
}