对象中的扩展运算符

  • 不能复制继承自原型对象的属性

    1. let o1 = { a: 1 };
    2. let o2 = { b: 2 };
    3. o2.__proto__ = o1;
    4. let { ...o3 } = o2;
    5. o3 // { b: 2 }
    6. o3.a // undefined
  • 可以读取继承自原型对象的属性 ```javascript const o = Object.create({ x: 1, y: 2 }); o.z = 3;

let { x, …{ y, z } } = o; x // 1 y // undefined z // 3

  1. - 只能 copy 可枚举属性
  2. ```javascript
  3. const obj = Object.defineProperty({ a: 1 }, 'b', {
  4. enumerable: false,
  5. value: 2
  6. })
  7. const cpObj = { ...obj }
  8. obj.a // 1
  9. obj.b // 2
  10. cpObj.a // 1
  11. cpObj.b // undefined
  12. 描述对象的enumerable属性,称为”可枚举性“,如果该属性为false,就表示某些操作会忽略当前属性
  13. 目前,有四个操作会忽略enumerable为false的属性。
  14. for...in循环; Object.keys(); JSON.stringify(); Object.assign()
  • 如果想完整克隆一个对象,还拷贝对象原型的属性,可以采用下面的写法 ```javascript // 写法1 const clone1 = Object.assign( Object.create(Object.getPrototypeOf(obj)), obj );

// 写法2 const clone2 = Object.create( Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj) ) ```