object.getprototypeof是获取对象[[prototype]]的规范方法,比__proto__更可靠,用于排查继承、方法来源及原型链问题,但不适用于原始值。

Object.getPrototypeOf 是一个直接获取对象原型(即 [[Prototype]])的内置方法,调试原型链时它比 obj.__proto__ 更规范、更可靠,尤其适合排查继承关系、方法来源或意外覆盖问题。
快速查看某个对象的直接原型
最基础用法:传入目标对象,返回它的上一级原型对象。比如:
const arr = [1, 2, 3]; console.log(Object.getPrototypeOf(arr) === Array.prototype); // true console.log(Object.getPrototypeOf(Array.prototype) === Object.prototype); // true console.log(Object.getPrototypeOf(Object.prototype)); // null(原型链终点)
这样能逐层确认对象是否如预期那样继承自某个构造函数的 prototype。
遍历整个原型链并打印结构
写个小工具函数,把原型链从当前对象一直向上走到 null,清晰展示层级:
function logPrototypeChain(obj) {
let current = obj;
let level = 0;
while (current !== null) {
console.log(`${' '.repeat(level)}→ ${current.constructor?.name || 'Object'} (at level ${level})`);
current = Object.getPrototypeOf(current);
level++;
}
}
logPrototypeChain([1, 2]); // 输出:→ Array → Object → null
这对理解类继承、混入(mixin)或框架中组件的原型关系特别有用。
区分实例属性和原型属性的来源
当不确定某个方法或属性是定义在实例上还是原型上时,可以用 Object.getPrototypeOf 配合 hasOwnProperty 或 in 判断:
- 用
obj.hasOwnProperty('method')检查是否为自有属性 - 若返回
false,再查Object.getPrototypeOf(obj).hasOwnProperty('method')看是否在原型上 - 也可直接用
'method' in obj判断是否可访问(含原型链)
例如调试为什么 myPromise.then 存在但 myPromise.constructor 是 Promise 而不是你自定义的类——很可能原型被替换了。
注意陷阱:不能用于原始值
Object.getPrototypeOf 只接受对象,对字符串、数字等原始值会先装箱,但容易引发误解:
Object.getPrototypeOf('hello'); // String.prototype(自动装箱)
Object.getPrototypeOf(42); // Number.prototype
如果想检查原始值的“逻辑原型”,应明确转换为对象再查,否则结果可能不符合直觉。日常调试建议只对明确的对象实例使用该方法。











