Object.assign()是浅复制(即:只复制对象得引用而,而不是新实例).它无法正确复制get属性和set属性.
看下面得例子:
// 定义一个source对象,含set方法
const source = {
set foo(value) {
console.log(value);
}
};
// 使用Object.assign进行赋值
const target1 = {};
Object.assign(target1, source);
// 使用getOwnPropertyDescriptor方法获取target1中的foo 并打印到控制台
console.log(Object.getOwnPropertyDescriptor(target1 , 'foo') )
结果如下:
可以发现.value的属性为undefined…
下面使用ES2017引入的Object.getOwnPropertyDescriptors方法配合Object.defineProperties方法解决set方法无法复制的问题
const source = {
set foo(value) {
console.log(value);
}
};
// Object.getOwnPropertyDescriptors:返回指定对象所有自身属性(非继承属性)的描述对象
// Object.defineProperties:给某个对象定义属性.
const target2 = {};
Object.defineProperties(target2, Object.getOwnPropertyDescriptors(source));
console.log(Object.getOwnPropertyDescriptor(target2, 'foo'));
可以看到set方法成功复制! get方法未定义故值未undefined.
// ES6写法
const shallowMerge = (target, source) => Object.defineProperties(
target,
Object.getOwnPropertyDescriptors(source)
};
参考《ES6标准入门》 P177~P179