Object.prototype.isPrototypeOf()
BaselineWidely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
isPrototypeOf()
はObject
インスタンスのメソッドで、オブジェクトが別のオブジェクトのプロトタイプチェーンに存在するかどうかを判定します。
メモ:isPrototypeOf()
は、instanceof
演算子とは異なります。object instanceof AFunction
という式では、object
のプロトタイプチェーンはAFunction
自身ではなく、AFunction.prototype
に対して判定されます。
試してみましょう
function Foo() {}function Bar() {}Bar.prototype = Object.create(Foo.prototype);const bar = new Bar();console.log(Foo.prototype.isPrototypeOf(bar));// Expected output: trueconsole.log(Bar.prototype.isPrototypeOf(bar));// Expected output: true
構文
isPrototypeOf(object)
引数
object
プロトタイプチェーンの検索対象。
返値
論理値で、呼び出されるオブジェクト (this
) がobject
のプロトタイプチェーンにあるかどうかを示します。オブジェクトthis
がオブジェクトでない(プリミティブである)場合はfalse
を返します。
例外
解説
Object.prototype
を継承するすべてのオブジェクト(つまり、null
プロトタイプオブジェクトを除くすべて)は、isPrototypeOf()
メソッドを継承します。このメソッドによって、オブジェクトが他のオブジェクトのプロトタイプチェーンの中に存在するかどうかを調べることができます。引数として渡されたobject
がオブジェクトでない(つまりプリミティブである)場合、このメソッドは直接false
を返します。そうでない場合、this
値はオブジェクトに変換され、object
のプロトタイプチェーンを、チェーンの終端に達するか、this
値が見つかるまで探します。
例
isPrototypeOf の使用
この例は、baz
オブジェクトのプロトタイプチェーンに、Baz.prototype
とBar.prototype
、Foo.prototype
、Object.prototype
が存在しているデモです。
class Foo {}class Bar extends Foo {}class Baz extends Bar {}const foo = new Foo();const bar = new Bar();const baz = new Baz();// プロトタイプチェーン:// foo: Foo --> Object// bar: Bar --> Foo --> Object// baz: Baz --> Bar --> Foo --> Objectconsole.log(Baz.prototype.isPrototypeOf(baz)); // trueconsole.log(Baz.prototype.isPrototypeOf(bar)); // falseconsole.log(Baz.prototype.isPrototypeOf(foo)); // falseconsole.log(Bar.prototype.isPrototypeOf(baz)); // trueconsole.log(Bar.prototype.isPrototypeOf(foo)); // falseconsole.log(Foo.prototype.isPrototypeOf(baz)); // trueconsole.log(Foo.prototype.isPrototypeOf(bar)); // trueconsole.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: クラスが宣言していないオブジェクトからプライベートメンバー #value を読み取ることはできません。}
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)) { // baz は Foo でないため実行されない console.log(Foo.getValue(baz));}
仕様書
Specification |
---|
ECMAScript® 2026 Language Specification # sec-object.prototype.isprototypeof |