javascript中无法直接复制对象作为原型,需用object.create()建立原型链后,再通过object.assign()等手动浅拷贝自有属性来模拟;该方式不处理不可枚举属性、symbol键或嵌套引用,深拷贝需额外实现。

JavaScript 中没有“直接复制对象作为原型”的内置语法,但可以通过 Object.create() 配合手动复制属性(浅拷贝)来模拟这种行为。关键在于:**原型继承本身不复制属性,只建立委托链;若要让子对象“看起来像”复制了父对象的全部自有属性,需额外执行属性拷贝**。
用 Object.create() 建立原型链
这是最标准、最安全的方式,用于让一个新对象以另一个对象为原型:
-
Object.create(proto)创建一个空对象,其[[Prototype]]指向proto - 它不会复制
proto的自有属性,只设置原型关系 - 后续可手动把
proto的可枚举自有属性复制过去(实现“伪复制”效果)
手动复制自有属性(浅拷贝)
在调用 Object.create() 后,用 Object.assign() 或 for...in + hasOwnProperty() 把源对象的自有属性“搬”到新对象上:
const parent = { a: 1, b: 2, method() { return this.a; } };
const child = Object.create(parent); // 原型是 parent
Object.assign(child, parent); // 浅拷贝自有属性 → a, b, method 都变成 child 自有属性
此时 child.a 不再通过原型查找,而是直接存在于 child 上 —— 表现上类似“复制了原型对象”。
注意深拷贝与不可枚举/符号属性
Object.assign() 只复制可枚举的自有字符串键属性,不处理:
- 不可枚举属性(如
Object.defineProperty(obj, 'x', { value: 1, enumerable: false })) - Symbol 键属性(需显式用
Object.getOwnPropertySymbols()获取) - 嵌套对象或数组(仍是引用,非深拷贝)
如需完整复制,应使用结构化克隆(structuredClone(),现代环境)或自定义深拷贝逻辑,但要注意这已超出“原型继承”范畴,属于对象克隆。
不推荐的旧方法:直接赋值 __proto__
虽然可以写 child.__proto__ = parent,但:
-
__proto__是非标准、已废弃的访问器,不推荐在生产代码中使用 - 无法同时完成属性复制,仍需额外步骤
- V8 等引擎对
__proto__赋值有性能惩罚
坚持用 Object.create() + Object.assign() 组合,语义清晰、兼容性好、行为可预测。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











