该Object.assign()方法用于将所有可枚举自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
const object1 = {
a: 1,
b: 2,
c: 3
};
const object2 = Object.assign({c: 4, d: 5}, object1);
console.log(object2.c, object2.d);
// expected output: 3 5
Object.assign(target,… sources)
target | sources | 返回值 |
---|---|---|
目标对象 | 源对象 | 目标对象 |
描述:
如果目标对象中的属性具有相同的键,则它们将被源中的属性覆盖。后来的资源属性同样会覆盖之前的属性。
该Object.assign()
方法仅将可枚举和自己的属性从源对象复制到目标对象。它[[Get]]
在源和[[Set]]
目标上使用,因此它将调用getter
和setter
。因此,它分配属性而不仅仅是复制或定义新属性。如果合并源包含getter,这可能使它不适合将新属性合并到原型中。用于将属性定义(包括其可枚举性)复制到原型中,Object.getOwnPropertyDescriptor()
而Object.defineProperty()
应该使用它们。
两者String
和Symbol
属性都被复制。
如果出现错误,例如,如果属性不可写,TypeError
则会引发a,target如果在引发错误之前添加了任何属性,则可以更改对象。
请注意,Object.assign()
不会抛出null
或undefined
源值。
示例:
在原型链和不可枚举的性能属性不能被复制
var obj = Object.create({ foo: 1 }, { // foo is on obj's prototype chain.
bar: {
value: 2 // bar is a non-enumerable property.
},
baz: {
value: 3,
enumerable: true // baz is an own enumerable property.
}
});
var copy = Object.assign({}, obj);
console.log(copy); // { baz: 3 }
克隆一个对象
var obj = { a: 1 };
var copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
深度克隆部分
对于深度克隆,我们需要使用其他替代方法,因为Object.assign()
复制属性值。如果源值是对象的引用,则它仅复制该引用值。
function test() {
'use strict';
let obj1 = { a: 0 , b: { c: 0}};
let obj2 = Object.assign({}, obj1);
console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
obj1.a = 1;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
obj2.a = 2;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}}
obj2.b.c = 3;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}
// Deep Clone
obj1 = { a: 0 , b: { c: 0}};
let obj3 = JSON.parse(JSON.stringify(obj1));
obj1.a = 4;
obj1.b.c = 4;
console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}}
}
test();
合并对象部分
var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };
var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 }, target object itself is changed.
具有相同属性的合并对象节
var o1 = { a: 1, b: 1, c: 1 };
var o2 = { b: 2, c: 2 };
var o3 = { c: 3 };
var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }