1 mdn - Object.assign()
含义:Object.assign()
方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。
语法:Object.assign(target, ...sources);
描述:
如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。
Polyfill:不支持symbol属性,由于ES5中不存在symbols。
深拷贝问题:针对深拷贝,需要使用其他的办法,因为Object.assign()拷贝的是可枚举属性。
Object.assign
方法只会拷贝源对象自身的并且可枚举的属性到目标对象。该方法使用源对象的[[Get]]
和目标对象的[[Set]]
,所以它会调用相关 getter 和 setter。因此,它分配属性,而不仅仅是复制或定义新的属性。如果合并源包含getter,这可能使其不适合将新属性合并到原型中。为了将属性定义(包括其可枚举性)复制到原型,应使用Object.getOwnPropertyDescriptor()
和Object.defineProperty()
。
补注:Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。该方法允许对一个属性的描述进行检索,在JavaScript中,属性由name和“属性描述符”对象构成。
一个属性描述符是一个记录:
-
value 该属性的值(仅针对数据属性描述符有效)
-
writable 当且仅当属性的值可以被改变时为true。(仅针对数据属性描述有效)
-
get 获取该属性的访问器函数(getter)。如果没有访问器, 该值为undefined。(仅针对包含访问器或设置器的属性描述有效)
-
set 获取该属性的设置器函数(setter)。 如果没有设置器, 该值为undefined。(仅针对包含访问器或设置器的属性描述有效)
-
configurable 当且仅当指定对象的属性描述可以被改变或者属性可被删除时,为true。
-
enumerable 当且仅当指定对象的属性可以被枚举出时,为 true。
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。