Object.prototype.isPrototypeOf()
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
語法
isPrototypeOf(object)
引數
object-
將被搜尋原型鏈的物件。
返回值
一個布林值,指示呼叫物件(this)是否位於 object 的原型鏈中。如果 object 不是一個物件(即基本型別),則直接返回 false。
異常
描述
所有繼承自 Object.prototype 的物件(即除了 null-prototype 物件 之外的所有物件)都繼承了 isPrototypeOf() 方法。此方法允許您檢查一個物件是否存在於另一個物件的原型鏈中。如果作為引數傳入的 object 不是一個物件(即基本型別),該方法將直接返回 false。否則,this 值將被 轉換為物件,然後搜尋 object 的原型鏈,直到達到鏈的末端或找到 this 值。
示例
使用 isPrototypeOf()
此示例演示了 Baz.prototype、Bar.prototype、Foo.prototype 和 Object.prototype 存在於物件 baz 的原型鏈中。
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 時才能安全執行的程式碼,您可以這樣做:
if (Foo.prototype.isPrototypeOf(baz)) {
// do something safe
}
然而,Foo.prototype 存在於 baz 的原型鏈中,並不意味著 baz 是使用 Foo 作為其建構函式建立的。例如,baz 的原型可以直接設定為 Foo.prototype。在這種情況下,如果您的程式碼嘗試從 baz 讀取 Foo 的 私有欄位,仍然會失敗。
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 運算子的品牌化檢查方法。
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 |
瀏覽器相容性
載入中…