Object.getPrototypeOf 不能实现深度克隆,它仅获取对象原型,不复制属性、不递归、不处理循环引用;真正深度克隆需用 structuredClone、JSON 方式或手动递归配合 Object.create 与属性描述符。

Object.getPrototypeOf 本身不能实现深度克隆,它只用于获取对象的原型(即 [[Prototype]]),和克隆逻辑无关。试图用它来“实现深度克隆”属于概念混淆——它不复制属性、不递归遍历、不处理循环引用,也不创建新对象。
为什么 Object.getPrototypeOf 不适合深度克隆
该方法返回的是目标对象的原型对象(通常是 Object.prototype 或自定义构造函数的 prototype),例如:
Object.getPrototypeOf({a: 1}) === Object.prototype // true
它不访问自身属性,不处理嵌套结构,更不生成副本。把它和克隆混为一谈,容易导致误用或写出无法工作的代码。
真正需要的深度克隆方案
深度克隆关注的是**递归复制所有可枚举/不可枚举自有属性(包括 symbol 键)、保持类型(Date、RegExp、Array 等)、处理循环引用**。常见可靠方式包括:
-
结构化克隆(推荐):现代环境支持
structuredClone(),原生、安全、支持 Map/Set/Date/BigInt 等,且自动处理循环引用。 -
JSON 方式(简单场景):
JSON.parse(JSON.stringify(obj)),但会丢失函数、undefined、Symbol、Date 对象、正则、循环引用,仅适用于纯数据对象。 -
手动递归实现:需判断类型(Array、Date、RegExp、Plain Object…)、使用
Object.create(Object.getPrototypeOf(obj))保留原型链(注意:这仅设原型,不复制属性!),再逐个属性深拷贝。
如果非要关联原型链:Object.getPrototypeOf 的正确用途
在深度克隆中,若需**保留原对象的原型(如继承自某个类的实例)**,可在创建新对象时用它配合 Object.create():
const clone = Object.create(Object.getPrototypeOf(original));
但这只是设置新对象的 [[Prototype]],后续仍需手动复制所有属性(含不可枚举、symbol 键等),例如:
- 用
Object.getOwnPropertyDescriptors()获取全部属性描述符 - 用
Object.defineProperties(clone, descriptors)复制 - 对每个属性值递归深克隆(尤其当值是对象时)
小结
Object.getPrototypeOf 是原型操作工具,不是克隆工具。深度克隆的核心是递归+类型识别+原型继承控制。若想保留原型,它可作为 Object.create() 的输入;若直接指望它“克隆”,结果一定是空对象或报错。优先用 structuredClone,其次考虑成熟库(如 lodash.cloneDeep),避免自己拼凑不完整方案。


















