object.assign函式用法
阿新 • • 發佈:2019-01-26
Object.assign()
方法用於將所有可列舉的屬性的值從一個或多個源物件複製到目標物件。它將返回目標物件。
語法
Object.assign(target, ...sources)
引數
target
- 目標物件。
sources
- (多個)源物件。
返回值
目標物件。
描述
如果目標物件中的屬性具有相同的鍵,則屬性將被源中的屬性覆蓋。後來的源的屬性將類似地覆蓋早先的屬性。
Object.assign
方法只會拷貝源物件自身的並且可列舉的屬性到目標物件身上。該方法使用源物件的
[ [ Get ] ] 和目標物件的 [ [ Set ] ],所以它會呼叫相關 getter 和 setter。因此,它分配屬性而不是複製或定義新的屬性。如果合併源包含了 getter,那麼該方法就不適合將新屬性合併到原型裡。假如是拷貝屬性定義到原型裡,包括它們的可列舉性,那麼應該使用 Object.getOwnPropertyDescriptor()
和 Object.defineProperty()
。
注意,在屬性拷貝過程中可能會產生異常,比如目標物件的某個只讀屬性和源物件的某個屬性同名,這時該方法會丟擲一個 TypeError
異常,拷貝過程中斷,已經拷貝成功的屬性不會受到影響,還未拷貝的屬性將不會再被拷貝。
注意, Object.assign
會跳過那些值為 null
或 undefined
的源物件。
示例
複製一個 object
var obj = { a: 1 };
var copy = Object.assign({}, obj);
console. log(copy); // { a: 1 }
深度拷貝問題
針對深度拷貝,需要使用其他方法,因為 Object.assign() 拷貝的是屬性值。假如源物件的屬性值是一個指向物件的引用,它也只拷貝那個引用值。
function test() {
let a = { b: {c:4} , d: { e: {f:1}} }
let g = Object.assign({},a)
let h = JSON.parse(JSON.stringify(a));
console.log(g.d) // { e: { f: 1 } }
g.d.e = 32
console.log('g.d.e set to 32.' ) // g.d.e set to 32.
console.log(g) // { b: { c: 4 }, d: { e: 32 } }
console.log(a) // { b: { c: 4 }, d: { e: 32 } }
console.log(h) // { b: { c: 4 }, d: { e: { f: 1 } } }
h.d.e = 54
console.log('h.d.e set to 54.') // h.d.e set to 54.
console.log(g) // { b: { c: 4 }, d: { e: 32 } }
console.log(a) // { b: { c: 4 }, d: { e: 32 } }
console.log(h) // { b: { c: 4 }, d: { e: 54 } }
}
test();
合併 objects
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 }, 注意目標物件自身也會改變。