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
)。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。