应优先使用 structuredclone() 保真还原原型链,现代环境支持该方法并自动保留 date、regexp 等类型原型;旧环境需用 object.create(object.getprototypeof(obj)) 显式重建原型再深拷贝属性,禁用 proto 或 constructor 修复;设计上宜减少原型依赖,改用鸭子类型与纯函数。

优先使用 structuredClone 保真还原原型链
现代环境(Chrome 98+、Firefox 94+、Safari 15.4+、Node.js 18.16+/20.6+)应直接调用 structuredClone()。它不是简单复制属性,而是按结构化克隆算法标准重建对象,对可序列化类型(Date、RegExp、Map、Set、ArrayBuffer、自定义类实例等)自动保留完整原型链。拷贝后 clone instanceof OriginalClass 仍为 true,方法和属性访问行为与原对象一致。
手动实现时必须显式重建原型关系
在不支持 structuredClone 的旧环境中,不能依赖 Object.assign 或 JSON 方案——它们产出的是普通 plain object,原型链完全丢失。正确做法是:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
Object.getPrototypeOf(obj)获取源对象原型 - 用
Object.create(proto)创建新空对象,并继承该原型 - 再逐个深拷贝自有属性(含 Symbol 键),避免污染原型上的方法
- 对内置特殊对象(如 Date、RegExp、Map)单独构造新实例,而非仅复制属性值
避免通过 __proto__ 或 constructor 赋值强行修复
手动设置 copy.__proto__ = obj.__proto__ 属非标准操作,在严格模式下可能报错,且对 Object.freeze() 对象无效;直接赋值 copy.constructor = obj.constructor 也不足以恢复完整继承链。真正可靠的原型还原必须发生在对象创建阶段,即 Object.create() 这一步,后续仅填充数据。
从设计源头减少对原型链的强依赖
频繁纠结拷贝后原型是否保留,往往说明设计上过度依赖 instanceof 或原型方法。更健壮的做法是:
- 用鸭子类型代替类型判断:检查
obj.getDate是否为函数,而非obj instanceof Date - 核心逻辑抽成纯函数,接收原始值(如时间戳、正则字符串)而非实例
- 为自定义类提供
toJSON()和静态fromJSON()方法,把序列化/反序列化路径收口可控 - 不在原型上挂载可变状态或闭包变量,防止拷贝后行为错乱
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










