Object.assign 不复制属性描述符。它仅遍历 Object.keys 的可枚举自有属性并执行赋值操作,导致 writable、configurable、get/set 等描述符全部丢失;需用 Object.getOwnPropertyDescriptors + Object.defineProperties 保留描述符。

不会。Object.assign 只复制属性的值,不复制属性描述符。
哪些描述符会丢失
所有通过 Object.defineProperty 设置的特性都会失效,包括:
- writable: false —— 拷贝后变成可写的普通属性
- configurable: false —— 拷贝后可以被 delete 或重新定义
- enumerable: false —— 本身就不会被 Object.assign 遍历到,更谈不上“丢失”
- get/set 访问器 —— getter 会被执行一次,结果作为普通值写入;setter 完全消失
它实际做了什么
Object.assign 的行为等价于:遍历 Object.keys(source) 得到的属性名,对每个 key 执行 target[key] = source[key]。
这个过程触发源对象的 getter(如果存在),并调用目标对象的 setter(如果存在),但不读取、也不还原任何属性描述符。
想保留描述符怎么办
必须换方法:
- 用 Object.getOwnPropertyDescriptors(source) 获取全部自有属性的完整描述符(含不可枚举、访问器等)
- 再用 Object.defineProperties(target, descriptors) 写入目标对象
- 若要克隆整个对象(含原型链),可用 Object.create(Object.getPrototypeOf(source), descriptors)
本质上,Object.assign 是“赋值操作”,不是“定义操作”。它不关心属性怎么来的,只管把当前能读到的值塞过去。

















