作用
把一个或多个源对象中 可枚举( Object.propertyIsEnumerable() 返回 true )和 自有属性( Object.hasOwnProperty() 返回 true)复制(浅拷贝)到目标对象。
以字符串 String 和符号 Symbol 为键的属性 会被复制,对每个符合条件的属性,源对象上的 [[Get]] 取得属性的值,然后使用目标 对象上的 [[Set]] 设置属性的值。
对每个源对象执行的是浅复制,多个源对象都有相同的属性以最后一个复制的值。
参数
- target 一个目标对象
-
返回
合成目标对象(修改原来的目标对象) ```javascript const target = { a: 1, b: 2 }; const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target); // Object { a: 1, b: 4, c: 5 } console.log(returnedTarget); // Object { a: 1, b: 4, c: 5 }
// 修改原来的目标对象 console.log(target === returnedTarget); // true
null / undefined 不能作为 target,会报 Connot convert undefined or null to object
```javascript
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const copy = Object.create(
{ foo: 1}, // 原型属性不可枚举
{
bar: {
value: 2 // 默认不可枚举
},
baz: {
value: 3,
enumerable: true
}
}
)
const returnedTarget = Object.assign(target, null, 1, false, [1, 2, 3], source, undefined, copy);
// {0: 1, 1: 2, 2: 3, a: 1, b: 4, baz: 3, c: 5}
source
- null / undefined,会被忽略
- 数组与字符串会被看成对象
- [1, 2, 3] => {0:1, 1:2, 2:3}
- “456” => {0:4, 1:5, 2:6}
- number 与 boolean 会为忽略
- 因为键名 [[PrimitveValue]] 只供系统内部使用,无法得到
- 不可枚举属性会被忽略
总结
}
function OtherClass {
}
function MyClass { SuperClass.call(this); OtherClass.call(this); }
MyClass.prototype = Object.create(superClass.prototype); Object.assign(MyClass.prototype, OtherClass.prototype);
整合原型上的方法
```javascript
function MyClass {
}
//MyClass.prototype.someMethod1 = function() {}
//MyClass.prototype.someMethod2 = function() {}
Object.assign(MyClass.prototype, {
someMethod1: function() {},
someMethod2: function() {},
}
克隆对象
function clone(origin){
var originProto = Object.getPrototypeOf(origin); // 获取原型 废弃方法 origin.__proto__
// 保证原型的拷贝
return Object.assign(Object.create(originProto), origin);
}
合并对象
var merge = (target, ...sources) => Object.assign(target, ...sources);