object.getprototypeof用于精准获取对象的[[prototype]]以重建原型链,而非拷贝属性;它配合object.create可还原自定义方法、访问器及instanceof一致性,并为多层继承和symbol等高级特性克隆提供原型基础。

Object.getPrototypeOf 不负责拷贝属性,而是帮你“接上原来的根”。深拷贝要真正独立,光复制数据不够,还得让副本继承原始对象的整个行为体系——比如自定义方法、访问器、instanceof 判断,这些都依赖原型链。它的核心价值,就是精准拿到那个“根”,再用它启动新对象。
还原原始原型,避免行为丢失
普通深拷贝(如递归遍历或 JSON 方式)只处理自有属性,会把原型链直接砍掉,导致副本变成 plain object,丢失所有原型上的方法和访问器。Object.getPrototypeOf(source) 能准确读出源对象真实的 [[Prototype]],比如可能是某个 class 的 prototype、Array.prototype,甚至 null。拿到后,用 Object.create(proto) 创建新对象,就天然继承了整条链的可访问能力。
- 例如:一个 class Person 的实例有 sayHello() 方法,该方法在 Person.prototype 上;仅用 { ...obj } 或 JSON 方式克隆,副本就没有 sayHello()
- 而 const copy = Object.create(Object.getPrototypeOf(obj)); 就能让 copy.sayHello() 正常调用
支撑 constructor 和 instanceof 的一致性
仅设原型还不够——copy.constructor 默认是 Object,不是原始构造函数。这会导致 instanceof 判断失败。Object.getPrototypeOf 是修复的前提:先确认源对象连在哪,再决定该把 constructor 指向谁。常见做法是手动赋值 copy.constructor = source.constructor,或更稳妥地用 Reflect.construct(source.constructor, []) 配合 Object.setPrototypeOf(copy, Object.getPrototypeOf(source))。
- 不修复时:copy instanceof Person === false
- 修复后:copy instanceof Person === true,语义完整
为多层继承和特殊属性克隆打基础
对于 class C extends B extends A 这类多层继承,Object.getPrototypeOf 只返回直接父原型,但它是递归遍历原型链的唯一可靠入口。你可以用它逐级向上取 proto,判断是否需要保留某层(比如跳过 Object.prototype),或配合 Object.getOwnPropertyDescriptors 把每层的访问器、不可枚举属性也一并克隆过去。
- 访问器(getter/setter)必须靠 Object.getOwnPropertyDescriptors + Object.defineProperties 实现,而 descriptors 的目标对象必须基于正确的原型创建——这个原型就来自 Object.getPrototypeOf
- Symbol 键、不可枚举属性等高级特性,同样依赖“先建对原型,再填对属性”的顺序
注意边界:它不操作、只诊断
Object.getPrototypeOf 是只读工具,返回值不能直接修改,也不能自动修复污染或合并冲突。它在深拷贝中起的是“定位”和“依据”作用:告诉你该连谁、不该连谁。真正的拷贝动作仍需 Object.create、Object.assign、Reflect.construct 或 structuredClone 等配合完成。现代环境推荐优先用 structuredClone,但它不处理原型链;此时 Object.getPrototypeOf 就成了手动补全行为一致性的关键桥梁。











