合并对象

ES6专门为合并对象提供了Object.assign()方法。这个方法接收一个目标对象和一个或多个源对象作为参数,然后将每个源对象中可枚举(Object.propertyIsEnumerable返回true)和自有属性(Object.hasOwnProperty返回true)复制到目标对象。以字符串和符号为键的属性会被复制。对每个符合条件的属性,这个方法会使用源对象上的[[GET]]取得属性的值,然后使用目标对象上[[Set]]设置属性的值。

简单复制

//简单复制
let dest,src,result;
dest={}
src={id:'src'};
result=Object.assign(dest, src);

//Object.assign修改目标对象,也会返回修改后的目标对象
console.log(dest===result) //true;
console.log(src!==result) // true;
console.log(result) //{id:src};
console.log(dest)//{id:src};

多个源对象

//多个源对象
dest={}
result=Object.assign(dest,{a:'foo'},{b:'bar'});
console.log(result);

获取函数与设置函数

Object.assign()实际上对每个源对象执行的是浅复制。如果多个源对象都有相同的属性,则使用最后一个复制的值。不能在两个对象间转移获取函数和设置函数。

dest={
    set a(val){
        console.log(`${val}`);
    }
}
src={
    get a(){
        console.log(`src getter`);
        return 'foo';
    }
};
Object.assign(dest, src);
//调用src的获取方法
//调用dest的设置方法并传入"foo"
//因为这里的设置函数不执行赋值操作,所以世纪上并没有把值转移过来。
console.log(dest);

对象引用

let dest,src,result;
dest={}
src={id:'src'};
//对象引用
Object.assign(dest, src);
//浅复制意味着只会复制对象的引用
console.log(dest)
console.log(dest.a=== src.a);