跳到主要内容

扩展对象

把一个对象属性复制到另外一个对象上是很常见的

把一个对象属性复制到另外一个对象上的方法
let target = { x: 1 }
let source = { y: 2, z: 3 }
for (let key of Object.keys(source)) {
target[key] = source[key]
}
console.log(target)
Object.assign() 复制扩展对象
// 使用Object.assign()
let o = Object.create(target) // 使用Object.create创建新对象,target是o的原型
let defaults = { m: 1000, n: 2000 }
o.pws = '文山'
console.log(o) // => {pws: '文山'}
// 扩展o对象,如果属性名相同则覆盖
Object.assign(o, defaults)
console.log(o) // => {pws: '文山', m: 1000, n: 2000}
// 需要创建一个新对象,先把默认值复制到新对象中,然后再扩展覆盖
o = Object.assign({}, defaults, o)
console.log(o) // => {m: 1000, n: 2000, pws: '文山'}
使用扩展运算符,扩展对象
o = { ...defaults, ...o }
合并对象函数,不覆盖已经存在的属性
// 与Object.assign()类似,但不覆盖已经存在的属性(同时也不处理符号属性)
function merge(target, ...sources) {
for (let source of sources) {
for (let key of Object.keys(source)) {
if (!(key in target)) {
// 这里跟Object.assign()不同
target[key] = source[key]
}
}
}
return target
}
let o2 = Object.assign({ x: 1 }, { x: 2, y: 2 }, { y: 3, z: 4 })
let o3 = merge({ x: 1 }, { x: 2, y: 2 }, { y: 3, z: 4 })
console.log(o2) // 覆盖原来属性 {x: 2, y: 3, z: 4}
console.log(o3) // 不覆盖原有属性 {x: 1, y: 2, z: 4}