1. 程式人生 > >ES6 對象的擴展 Object.assign()

ES6 對象的擴展 Object.assign()

擴展 const eof npr clas object 多個 合並 對象

1.用於對象的合並,將源對象(source)的所有可枚舉屬性,復制到目標對象(target)   Object.assign方法的第一個參數是目標對象,後面的參數都是源對象。   
const target = { a: 1 };
const source1 = { b: 2 };
const source2 = { c: 3 };
Object.assign(target, source1, source2);
console.log(target) //{a: 1, b: 2, c: 3}
2.如果目標對象與源對象有同名屬性,或多個源對象有同名屬性,則後面的屬性會覆蓋前面的屬性。
const target = { a: 1, b: 1 };
const source1 
= { b: 2, c: 2 }; const source2 = { c: 3 }; Object.assign(target, source1, source2); console.log(target) //{a: 1, b: 2, c: 3} //Object.assign數組處理 var obj = Object.assign([1, 2, 3], [4, 5]); console.log(obj); //[4, 5, 3] //由於數組當做對象來處理所以值出現覆蓋
3.Object.assign方法實行的是淺拷貝,而不是深拷貝。也就是說,如果源對象某個屬性的值是對象,那麽目標對象拷貝得到的是這個對象的引用。
const obj1 = {a: {b: 1}};
const obj2 
= Object.assign({}, obj1); obj1.a.b = 2; console.log(obj2); //{a:{b:2}}
4.Object.assign方法只能進行值的復制,如果要復制的值是一個取值函數,那麽將求值後再復制。
const source = {
    get test() { return 1 }
};
const target = {};
Object.assign(target, source)
console.log(target); //{test: 1}
5.常見用途 (1)為對象添加屬性或方法或合並多個對象或為屬性指定默認值
var default_var = { test:0 }
    
var obj = {b:1} var test = Object.assign(obj,default_var,{ test:"1", func1:function(){ console.log(1) }, func2:function(){ console.log(1) } }) console.log(test)
(2)克隆對象
function clone(origin) {
    let originProto = Object.getPrototypeOf(origin);
    return Object.assign(Object.create(originProto), origin);
}
6.Object.assign方法參數相關
const obj = {a: 1};
Object.assign(obj) === obj // true

typeof Object.assign(2) // "object"

Object.assign(undefined) // 報錯
Object.assign(null) // 報錯

let obj = {a: 1};
Object.assign(obj, undefined) === obj // true  undefined會被忽略
Object.assign(obj, null) === obj // true  undefined會被忽略

const v1 = ‘abc‘;
const v2 = true;
const v3 = 10;
const obj = Object.assign({}, v1, v2, v3);
console.log(obj); // { "0": "a", "1": "b", "2": "c" }

ES6 對象的擴展 Object.assign()