在 JavaScript 中,原型链是对象属性查找的核心机制。本篇文章以三个常用方法讲透如何查看对象原型与原型链的关系,帮助你在调试和设计对象模型时快速定位问题。
1. 方法一:使用 Object.getPrototypeOf 查看对象原型
原型定位的基本用法
Object.getPrototypeOf 是查看对象直接原型的标准方法,它返回对象的直接原型对象,提供了比直接访问更明确的语义。
通过 Object.getPrototypeOf(obj),你可以判断一个对象的原型是否为某个特定对象,从而了解原型链的起点。
const o = { x: 1 };
console.log(Object.getPrototypeOf(o) === Object.prototype); // true
对于没有显式原型的对象,如通过工厂函数或 Object.create(null) 创建的对象,Object.getPrototypeOf 的返回值会有所不同,前者通常是 Object.prototype,而后者则是 null。
const o2 = Object.create(null);
console.log(Object.getPrototypeOf(o2)); // null
2. 方法二:通过 __proto__ 直接访问对象原型
直接访问的便捷性与注意事项
__proto__ 是一个用于访问和设置对象原型的属性,在多数浏览器环境中都可用,它提供了直观的原型链浏览能力。

使用 obj.__proto__ 可以快速获取对象的原型对象,便于在交互式调试中快速查看原型的结构。
console.log([].__proto__ === Array.prototype); // true
需要注意的是,__proto__ 存在历史兼容性和性能考量,某些场景不鼓励通过 setter 修改原型链,从而避免引发难以察觉的副作用。
let a = {};
a.__proto__ = { extra: 123 };
console.log(a.extra); // 123
3. 方法三:利用 isPrototypeOf 与 instanceof 判断原型链
判断原型链中的关系
在复杂的原型链中,isPrototypeOf 与 instanceof 提供了两种不同的判断方式,用于判断某个对象是否在另一对象的原型链上。
Foo.prototype.isPrototypeOf(obj) 用于判断 Foo.prototype 是否出现在 obj 的原型链上;而 obj instanceof Foo 则判断 obj 的原型链上是否存在 Foo.prototype。
function Foo() {}
function Bar() {}
Bar.prototype = Object.create(Foo.prototype);
Bar.prototype.constructor = Bar;const x = new Bar();
console.log(Foo.prototype.isPrototypeOf(x)); // true
console.log(x instanceof Foo); // true
还可以用 Object.prototype.isPrototypeOf 做更底层的检查,以确认某个原型对象是否在给定对象的原型链上。
console.log(Object.prototype.isPrototypeOf(x)); // true


