广告

JS如何查看对象原型?3种常用方法讲透原型链

在 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__ 是一个用于访问和设置对象原型的属性,在多数浏览器环境中都可用,它提供了直观的原型链浏览能力。

JS如何查看对象原型?3种常用方法讲透原型链

使用 obj.__proto__ 可以快速获取对象的原型对象,便于在交互式调试中快速查看原型的结构。

console.log([].__proto__ === Array.prototype); // true

需要注意的是,__proto__ 存在历史兼容性和性能考量,某些场景不鼓励通过 setter 修改原型链,从而避免引发难以察觉的副作用。

let a = {};
a.__proto__ = { extra: 123 };
console.log(a.extra); // 123

3. 方法三:利用 isPrototypeOf 与 instanceof 判断原型链

判断原型链中的关系

在复杂的原型链中,isPrototypeOfinstanceof 提供了两种不同的判断方式,用于判断某个对象是否在另一对象的原型链上。

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

广告