object.assign 只复制对象自身的可枚举属性,不复制原型链上的方法;如 array.prototype.map 不会被 object.assign({}, [1,2]) 复制。

Object.assign 不能复制原型上的方法,它只操作对象自身的可枚举属性。
Object.assign 的作用范围有限
Object.assign(target, source) 会遍历 source 对象**自身(own)的可枚举(enumerable)属性**,并将其键值对复制到 target 上。原型链上的方法(比如定义在 prototype 上的函数)不属于对象自身的属性,因此不会被复制。
- 例如:
Array.prototype.map是挂在 Array 构造函数原型上的,Object.assign({}, [1,2])不会把 map 方法复制到空对象上 - 即使你手动把一个有原型方法的对象作为 source,比如
Object.assign({}, obj),也只复制 obj 自身属性,不包括obj.__proto__上的方法
想“复制原型方法”,本质是复制行为逻辑,不是复制原型关系
如果你希望目标对象能调用某类原型方法(比如让普通对象拥有类似数组的 map 能力),实际做法不是复制原型,而是:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 借用方法:用
Array.prototype.map.call(arrayLike, ...) - 显式赋值:把函数引用赋给目标对象的自有属性,如
target.map = Array.prototype.map - 设置原型:用
Object.setPrototypeOf(target, Array.prototype)(不推荐,影响性能且破坏封装)
替代方案:用 Object.getOwnPropertyDescriptors + Object.defineProperties
如果真需要把某个对象(包括其原型链中继承来的)的所有**自有**方法都“平铺”到新对象上,可以结合 getOwnPropertyDescriptors 和 Object.getPrototypeOf 手动遍历原型链,但要注意:
- 这依然不会“复制原型链”,只是把各层原型上的方法提取出来,定义为新对象的自有属性
- 需过滤掉不可枚举、不可写、不可配置的属性(默认 getOwnPropertyDescriptors 只返回自有可枚举属性,如需全部,要配合 propertyIsEnumerable 或直接读 descriptor)
- 示例片段:
const descriptors = Object.getOwnPropertyDescriptors(source);<br> Object.defineProperties(target, descriptors);
这仅处理 source 自身属性,不包含原型
真正需要的是明确目的,再选合适方式
多数情况下,开发者误以为要用 Object.assign 复制原型方法,其实是想实现以下之一:
- 浅拷贝对象数据(用 Object.assign 正确)
- 让对象具备某类能力(优先考虑组合或工具函数,而非篡改原型)
- 创建继承某原型的新实例(用 new、Object.create 或 class extends)
- 临时复用原型方法(用 call/apply/bind 借用即可)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










