深拷贝不处理原型链,只复制对象自身可枚举属性和嵌套值;需继承原型时应使用 new constructor() 或 object.create() 等方式创建新实例,而非深拷贝。

深拷贝本身不处理原型链上的继承属性,它只复制对象自身的可枚举属性和嵌套值。原型链属于对象的结构关系,不是数据内容,所以所有标准深拷贝方式(包括 JSON.parse(JSON.stringify())、structuredClone()、Lodash 的 cloneDeep)都会忽略 __proto__、constructor 和原型上的方法或属性。
深拷贝天然剥离原型链
这是设计使然,不是缺陷:
- 原型链承载的是行为(如
obj.toString()、user.save()),而深拷贝关注的是状态(如name、score等数据); - 函数、
Date、RegExp、Symbol等在 JSON 序列化中会丢失或变形,更无法还原其原型上下文; - 强行恢复原型可能破坏封装——比如原型中依赖闭包变量或私有字段,拷贝后无法重建。
需要继承原型时,不该用深拷贝
如果你的对象依赖原型上的方法(例如 car.start() 来自 Car.prototype.start),说明你真正需要的是“新实例”,而不是“数据副本”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
new Constructor()创建新对象,自动链接到正确原型; - 用
Object.create(Object.getPrototypeOf(original))手动创建空对象并设置原型,再合并自有属性; - 对已有对象做浅拷贝(如
Object.assign({}, obj))后,再用Object.setPrototypeOf()补原型(注意:仅限调试或特殊场景,不推荐生产使用)。
想同时保留数据+原型?手写“原型感知克隆”
若业务强依赖此能力(如测试模拟、低代码引擎),可手动实现:
- 先用
Object.getPrototypeOf(obj)获取原原型; - 用
Object.create(proto)创建新对象,确保原型链一致; - 递归深拷贝对象自身所有可枚举属性(跳过不可枚举、跳过函数除非明确需要);
- 用
WeakMap处理循环引用,避免栈溢出。
注意:该方式仍无法还原函数内部闭包、WeakMap/WeakSet 实例、DOM 节点等不可序列化内容。
实际开发中的推荐做法
多数情况下,应按职责分离原则设计:
- 纯数据对象(DTO、API 响应)→ 用深拷贝,不关心原型;
- 带行为的对象(业务实体、领域模型)→ 用构造函数或 class 实例化,天然保有原型;
- 需复用逻辑又隔离状态 → 抽离方法到工具函数或组合式逻辑,而非依赖原型继承。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










