Object.prototype.isPrototypeOf()

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

isPrototypeOf() 方法用于检查一个对象是否存在于另一个对象的原型链中。

注意: isPrototypeOf()instanceof 操作符不同。在表达式 object instanceof AFunction 中,会检查 object 的原型链是否与 AFunction.prototype 匹配,而不是与 AFunction 本身匹配。

试一试

function Foo() {}
function Bar() {}

Bar.prototype = Object.create(Foo.prototype);

const bar = new Bar();

console.log(Foo.prototype.isPrototypeOf(bar));
// Expected output: true
console.log(Bar.prototype.isPrototypeOf(bar));
// Expected output: true

语法

js
isPrototypeOf(object)

参数

object

将被搜索原型链的对象。

返回值

一个布尔值,指示调用对象(this)是否位于 object 的原型链中。如果 object 不是一个对象(即基本类型),则直接返回 false

异常

TypeError

如果 thisnullundefined(因为它们无法被 转换为对象),则会抛出错误。

描述

所有继承自 Object.prototype 的对象(即除了 null-prototype 对象 之外的所有对象)都继承了 isPrototypeOf() 方法。此方法允许您检查一个对象是否存在于另一个对象的原型链中。如果作为参数传入的 object 不是一个对象(即基本类型),该方法将直接返回 false。否则,this 值将被 转换为对象,然后搜索 object 的原型链,直到达到链的末端或找到 this 值。

示例

使用 isPrototypeOf()

此示例演示了 Baz.prototypeBar.prototypeFoo.prototypeObject.prototype 存在于对象 baz 的原型链中。

js
class Foo {}
class Bar extends Foo {}
class Baz extends Bar {}

const foo = new Foo();
const bar = new Bar();
const baz = new Baz();

// prototype chains:
// foo: Foo --> Object
// bar: Bar --> Foo --> Object
// baz: Baz --> Bar --> Foo --> Object
console.log(Baz.prototype.isPrototypeOf(baz)); // true
console.log(Baz.prototype.isPrototypeOf(bar)); // false
console.log(Baz.prototype.isPrototypeOf(foo)); // false
console.log(Bar.prototype.isPrototypeOf(baz)); // true
console.log(Bar.prototype.isPrototypeOf(foo)); // false
console.log(Foo.prototype.isPrototypeOf(baz)); // true
console.log(Foo.prototype.isPrototypeOf(bar)); // true
console.log(Object.prototype.isPrototypeOf(baz)); // true

isPrototypeOf() 方法——以及 instanceof 操作符——在处理只能与特定原型链的某个派生对象交互的代码时特别有用;例如,为了保证该对象上存在某些方法或属性。

例如,要执行一段只有在 baz 对象在其原型链中具有 Foo.prototype 时才能安全运行的代码,您可以这样做:

js
if (Foo.prototype.isPrototypeOf(baz)) {
  // do something safe
}

然而,Foo.prototype 存在于 baz 的原型链中,并不意味着 baz 是使用 Foo 作为其构造函数创建的。例如,baz 的原型可以直接设置为 Foo.prototype。在这种情况下,如果您的代码尝试从 baz 读取 Foo私有字段,仍然会失败。

js
class Foo {
  #value = "foo";
  static getValue(x) {
    return x.#value;
  }
}

const baz = { __proto__: Foo.prototype };

if (Foo.prototype.isPrototypeOf(baz)) {
  console.log(Foo.getValue(baz)); // TypeError: Cannot read private member #value from an object whose class did not declare it
}

instanceof 也是如此。如果您需要安全地读取私有字段,请考虑提供一个使用 in 操作符的品牌化检查方法。

js
class Foo {
  #value = "foo";
  static getValue(x) {
    return x.#value;
  }
  static isFoo(x) {
    return #value in x;
  }
}

const baz = { __proto__: Foo.prototype };

if (Foo.isFoo(baz)) {
  // Doesn't run, because baz is not a Foo
  console.log(Foo.getValue(baz));
}

规范

规范
ECMAScript® 2026 语言规范
# sec-object.prototype.isprototypeof

浏览器兼容性

另见