Object.getPrototypeOf() 返回对象内部[[Prototype]]槽的真实值,不依赖constructor、__proto__或上下文,稳定跨iframe,是判断继承和调试原型链的底层锚点。

Object.getPrototypeOf() 的核心语义是“读取对象内部 [[Prototype]] 槽的真实值”,它不看 constructor、不碰 __proto__、不依赖上下文,只返回引擎底层实际指向的那个原型对象。这个行为稳定、不可篡改、跨 iframe 一致,是判断继承关系和调试原型链的底层锚点。
它返回什么,不是什么
返回的是对象创建时就确定的隐式原型引用,不是构造函数的 prototype 属性,也不是你写在代码里的类名或字符串标识:
- 实例对象:Object.getPrototypeOf(new Date()) → Date.prototype
- 函数本身:Object.getPrototypeOf(Date) → Function.prototype(Date 是函数,它的原型是 Function.prototype)
- 构造器的 prototype 属性:Object.getPrototypeOf(Date.prototype) → Object.prototype(因为 prototype 本身是普通对象)
- class 继承中的类函数:Object.getPrototypeOf(Child) === Parent(子类函数的 [[Prototype]] 指向父类函数,用于继承静态方法)
- Object.create(null):Object.getPrototypeOf(obj) 直接返回 null,链长为 0
必须避开的三类典型误用
这些错误看似合理,实则混淆语义或引发运行时异常:
- 传原始值不校验:Object.getPrototypeOf("abc") 在部分环境会自动包装并返回 String.prototype,但 Object.getPrototypeOf(42) 或 Object.getPrototypeOf(null) 一定抛 TypeError;稳妥做法是先判 obj != null && typeof obj === 'object'
- 用 constructor.prototype 替代它:obj.constructor && obj.constructor.prototype 不可靠——constructor 可被覆盖,prototype 可被重赋值,而 Object.getPrototypeOf(obj) 始终反映真实继承链
- 遍历时用 while(p):当某层原型是 {}(空对象)时,p 为真值但非 null,循环不会终止;正确终止条件只能是 p !== null
跨环境与调试中的关键优势
在微前端、iframe 多上下文或混淆代码场景下,它是比 instanceof 和 constructor 更底层、更可信的判断依据:
立即学习“Java免费学习笔记(深入)”;
- 识别原生类型:Object.getPrototypeOf(arr) === Array.prototype,不受 arr.constructor 被改写影响
- 验证继承链完整性:Object.getPrototypeOf(Object.getPrototypeOf(childInstance)) === Parent.prototype,可确认两层继承是否生效
- 排查方法丢失问题:调用 obj.foo 报错时,逐级检查 Object.getPrototypeOf(obj)、Object.getPrototypeOf(Object.getPrototypeOf(obj)) 是否包含 foo,快速定位定义层级
- 区分“裸对象”与“行为对象”:Object.getPrototypeOf(config) === Object.prototype 表明可安全 Object.assign;若返回 Date.prototype 或自定义类原型,则需考虑方法继承风险
替代 __proto__ 的标准姿势
__proto__ 是非标准遗留属性,可读可写,易引发性能问题或静默失败;Object.getPrototypeOf() 是唯一标准读取方式:
- 读取一律用它:Object.getPrototypeOf(obj),语义清晰、严格报错、兼容 IE9+
- 设置原型用 Object.setPrototypeOf():避免 obj.__proto__ = newProto 这类副作用操作
- 创建时指定原型用 Object.create():Object.create(proto) 比手动赋 __proto__ 更规范、更高效


















