ES6

作用

把一个或多个源对象中 可枚举( Object.propertyIsEnumerable() 返回 true )和 自有属性( Object.hasOwnProperty() 返回 true)复制(浅拷贝)到目标对象。

以字符串 String 和符号 Symbol 为键的属性 会被复制,对每个符合条件的属性,源对象上的 [[Get]] 取得属性的值,然后使用目标 对象上的 [[Set]] 设置属性的值。
对每个源对象执行的是浅复制,多个源对象都有相同的属性以最后一个复制的值。

参数

  • target 一个目标对象
  • src 一个或多个源对象

    返回

  • 合成目标对象(修改原来的目标对象) ```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

  1. null / undefined 不能作为 target,会报 Connot convert undefined or null to object
  2. ```javascript
  3. const target = { a: 1, b: 2 };
  4. const source = { b: 4, c: 5 };
  5. const copy = Object.create(
  6. { foo: 1}, // 原型属性不可枚举
  7. {
  8. bar: {
  9. value: 2 // 默认不可枚举
  10. },
  11. baz: {
  12. value: 3,
  13. enumerable: true
  14. }
  15. }
  16. )
  17. const returnedTarget = Object.assign(target, null, 1, false, [1, 2, 3], source, undefined, copy);
  18. // {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]] 只供系统内部使用,无法得到
  • 不可枚举属性会被忽略

总结

  1. 浅拷贝
  2. 同名会替换
  3. 处理数组,字符串,原始值,null, undefined 的注意点

    应用

    整合 class mixins ```javascript function SuperClass {

}

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);