深拷贝不保留原型链是其设计本质,只复制自有属性和嵌套值;需保留原型时应改用Object.create、构造函数或类实例化,而非深拷贝。

深拷贝本身不保留原型链,这是它的设计本质——它只复制可枚举的自有属性和嵌套值,而原型是对象的隐式链接([[Prototype]]),不属于“数据内容”。因此,在面向对象设计中,“完美处理原型链”不是让深拷贝自动继承原型,而是根据场景主动选择:要么放弃原型、走纯数据路线;要么绕过深拷贝、改用原型继承机制。
深拷贝天然剥离原型,这是合理行为
所有主流深拷贝实现(包括 JSON.parse(JSON.stringify())、Lodash 的 cloneDeep、手写递归)都只遍历对象自身的可枚举属性,不会读取或重建 __proto__ 或 constructor 关系。这是因为:
- 原型链属于对象的“行为结构”,不是“状态数据”;
- 拷贝后若强行恢复原型,可能破坏封装(比如私有方法、闭包变量无法还原);
- 函数、Symbol、Date 等类型在 JSON 拷贝中已丢失,更无法还原其原型上下文。
需要保留原型时,别用深拷贝,改用原型继承
如果你的对象依赖原型上的方法(如 user.greet() 来自 User.prototype.greet),那么真正该做的是实例复用或继承,而不是拷贝:
- 用
Object.create(Original.prototype)创建新实例,再用Object.assign()浅拷贝自有属性; - 构造函数中通过
new Parent()初始化,确保新对象正确链接到原型; - 类语法下直接
new MyClass(...),天然保有完整原型链。
混合方案:深拷贝数据 + 手动挂载原型
极少数场景需“既有独立数据,又保留方法访问”,可分两步操作:
立即学习“Java免费学习笔记(深入)”;
- 先用深拷贝获取干净的数据副本(如接口返回的用户信息);
- 再用
Object.setPrototypeOf(newData, Constructor.prototype)显式设置原型; - 注意:必须确保该原型上无依赖
this外部闭包的状态,否则行为不可靠。
推荐实践:按职责分离“数据”与“行为”
面向对象设计中更健壮的方式是解耦:
- 把纯数据(如
{ name, age, address })当作 DTO 处理,用深拷贝安全传递; - 把行为封装在独立类或工具函数中(如
formatUser(user)、validateUser(user)),不绑定到数据对象上; - 避免让业务对象既存状态又管逻辑,这样就无需纠结“拷贝时要不要带原型”。


















