将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。
参数(target,...source):target是目标对象;source是源对象
注意:
1.第一个参数不能出现undefined和null
2.后面的参数如果出现undefined、null会忽略它们
3.参数为数组或字符串的话,是以对象的方式来处理,number类型、布尔类型会忽略(它们的键名拿不到),同名会替换
4.继承属性和不可枚举属性是不能拷贝的
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const res = Object.assign(
target,
null,
1,
false,
[1, 2, 3],
source,
undefined,
'123',
Object.create(
{
foo: 1
},
{
bar: {
value: 2,
enumerable: false
},
baz: {
value: 3,
enumerable: true
}
}
)
);
console.log(target);
console.log(res);
例子:
如果Object.assign()拷贝的值还是对象的话,那么实际上它拷贝的是一份引用。
let obj1 = {
a: 0,
b: {
c: 0
}
};
let obj2 = Object.assign({}, obj1);
obj1.b.c = 3;
console.log(obj2);
合并原型
function f1() {
}
function f2() {
}
function MyFn() {
f1.call(this);
f2.call(this);
}
MyFn.prototype = Object.create(f1.prototype);
Object.assign = (MyFn.prototype, f2.prototype);
给原型上追加方法
function MyFn() {
}
// MyFn.prototype.someMethod1 = function () {
// }
Object.assign(MyFn.prototype, {
someMethod1: function () {
},// 相当于上面的注释
someMethod2: function () {
}
})
克隆对象
function clone(origin) {
let originProto = Object.getPrototypeOf(origin);
return Object.assign(Object.create(originProto), origin);
}