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