Object.assign() 与 扩展属性的区别

Object.assign() 和 扩展属性,功能上来说很相似,具体有什么不同呢?

1. 基础使用

简单的情况下,Object.assign() 与 扩展属性可以互换。

const obj = { "foo": "bar" }
const obj1 = { ...obj }
const obj2 = Object.assign({}, obj)
obj.foo === obj1.foo; // true
obj.foo === obj2.foo; // true
obj === obj1; // false
obj === obj2; // false

另外:

const obj3 = Object.assign(obj);
obj === obj3

2. 进阶使用

Object.assign() 会调用 setter

class MyClass {
    set val(v) {
        console.log('Setter called', v);
        return v;
    }
}

const obj = new MyClass();

Object.assign(obj,  { val:  42  }); // console Setter called 42

{...obj, ...{val: 42}}; // console nothing

Object.assign() 修改了一个对象,因此它可以触发 ES6 setter

3. 最后

如果一个 Object 使用了 Object.defineProperty 修改了 set 方法,再调用 Object.assign(),会用意想不到的错误。(因为 Object.assign() 会触发 setter)。

你可能感兴趣的:(javascript,object)