Movatterモバイル変換


[0]ホーム

URL:


MDN Web Docs

このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

Object.prototype.isPrototypeOf()

BaselineWidely available

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

構文

js
isPrototypeOf(object)

引数

object

プロトタイプチェーンの検索対象。

返値

論理値で、呼び出されるオブジェクト (this) がobject のプロトタイプチェーンにあるかどうかを示します。オブジェクトthis がオブジェクトでない(プリミティブである)場合はfalse を返します。

例外

TypeError

thisnull またはundefined の場合に発生します(オブジェクトに変換できないため)。

解説

Object.prototype を継承するすべてのオブジェクト(つまり、null プロトタイプオブジェクトを除くすべて)は、isPrototypeOf() メソッドを継承します。このメソッドによって、オブジェクトが他のオブジェクトのプロトタイプチェーンの中に存在するかどうかを調べることができます。引数として渡されたobject がオブジェクトでない(つまりプリミティブである)場合、このメソッドは直接false を返します。そうでない場合、this 値はオブジェクトに変換され、object のプロトタイプチェーンを、チェーンの終端に達するか、this 値が見つかるまで探します。

isPrototypeOf の使用

この例は、baz オブジェクトのプロトタイプチェーンに、Baz.prototypeBar.prototypeFoo.prototypeObject.prototype が存在しているデモです。

js
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 に由来しているか検証してみます。

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

しかし、Foo.prototypebaz のプロトタイプチェーンに存在したからといって、bazFoo をコンストラクターとして使用して作成されたとは限りません。例えば、bazFoo.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: クラスが宣言していないオブジェクトからプライベートメンバー #value を読み取ることはできません。}

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)) {  // baz は Foo でないため実行されない  console.log(Foo.getValue(baz));}

仕様書

Specification
ECMAScript® 2026 Language Specification
# sec-object.prototype.isprototypeof

ブラウザーの互換性

関連情報

Help improve MDN

Learn how to contribute.

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp