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

瀏覽器相容性

另見