在es6中提供了一個新的方法,非常方便,Object.assign();
使用assign主要是為了簡化對象的混入(mixin)?;烊胧侵傅脑谝粋€對象中引用另一個對象的屬性或方法。
assing可以把一個對象的屬性和方法完整的轉copy到另外一個對象中。
在es5中復制一個對象,需要很長的一段代碼,而es6完全解決了這個問題:
var p = {
name : "lisi",
age : 20,
friends : ['張三', '李四']
}
var p1 = {};
Object.assign(p1, p); //則p1中就有了與p相同的屬性和方法. p1是接受者,p是提供者
console.log(p1);
//這種copy是淺copy,也就是說如果屬性值是對象的話,只是copy的對象的地址值(引用)
console.log(p1.friends == p.friends); //true p1和p的friends同事指向了同一個數組。
p.friends.push("王五");
console.log(p1.friends); //['張三', '李四', '王五']
由此可以看出,復制的對象與被復制的對象是同步的,不管你修改的是復制的對象還是被復制對象的值,都是同步體現的!當然添加屬性的時候也是適用的!
assign方法可以接受任意多的提供者。意味著后面提供者的同名屬性和覆蓋前面提供者的屬性值。
var p = {
name : "lisi",
age : 20,
friends : ['張三', '李四']
}
var p1 = {
name : 'zs',
}
var p2 = {};
Object.assign(p2, p, p1); //p和p1都是提供者
console.log(p2.name); // zs
通過上面的代碼可以看出,當出現多個參數的時候,后面提供者的同名屬性和覆蓋前面提供者的屬性值。(覆蓋的作用)
還有一種情況,如下:
var p = {
name : "lisi",
age : 20,
friends : ['張三', '李四']
}
var p1 = {
age1 : 30,
};
Object.assign(p1, p); //則p1中就有了與p相同的屬性和方法. p1是接受者,p是提供者
console.log(p1); //Object { {age1: 30, name: "lisi", age: 20, friends: Array(3),}
//這種copy是淺copy,也就是說如果屬性值是對象的話,只是copy的對象的地址值(引用)
五']
如果接收的對象里面存在了某個屬性,提供者的屬性就會被添加到接受對象的后面;