Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2015年7月以降、すべてのブラウザーで利用可能です。
instanceof 演算子は、あるコンストラクターの prototype プロパティが、あるオブジェクトのプロトタイプチェーンの中のどこかに現れるかどうかを検査します。返値は論理値です。この動作は Symbol.hasInstance でカスタマイズすることができます。
検査するオブジェクトです。
constructor検査対象の関数です。
constructor がオブジェクトでない場合、発生します。 constructor が [Symbol.hasInstance]() メソッドを持っていない場合は、関数でなければなりません。
instanceof 演算子は、 object のプロトタイプチェーンに constructor.prototype が存在することを検査します。これ通常(ただし常にではない)、objectがconstructorで構築されたということを意味しています。
なお、オブジェクト作成後に constructor.prototype が再代入されると(通常は推奨されません)、instanceof 検査の値が変化する可能性があります。また、Object.setPrototypeOf を使用して object のプロトタイプを変更することで、この値を変更することもできます。
クラスも同様に動作する方法です。クラスにも prototype プロパティが存在するためです。
バインド済み関数については、instanceof は対象とする関数の prototype プロパティを見ていきます。これは、バインド済み関数には prototype が存在しないためです。
constructor が Symbol.hasInstance メソッドを持つ場合、そのメソッドが優先的に呼び出され、引数として object のみを受け取り、 this として constructor が渡されます。
すべての関数は既定で Function.prototype を継承するため、右辺が関数である場合、ほとんどの場合は Function.prototype[Symbol.hasInstance]() メソッドが instanceof の動作を指定します。 instanceof の正確なアルゴリズムについては、Symbol.hasInstance ページを参照してください。
JavaScriptの実行環境(ウィンドウ、フレームなど)は、それぞれの独自の領域に属しています。つまり、組み込まれているものも変わります(別々なグローバルオブジェクト、別々なコンストラクター、など)。これにより予期せぬ結果になる場合があります。例えば、[] instanceof window.frames[0].Array は false を返します。 Array.prototype !== window.frames[0].Array.prototype であり、配列は前者を継承しているからです。
これは、始めはわかりにくいかもしれませんが、スクリプトで複数のフレームやウィンドウを扱い、オブジェクトをあるコンテキストから別のコンテキストへ関数を経由して渡すようになると、正当かつ重要な事項になります。例えば、 Array.isArray() を使用すると、与えられたオブジェクトが実際に配列であるかどうかを安全にチェックできます。
例えば、別のコンテキストである Node が SVGElement であるかどうかをチェックするには、myNode instanceof myNode.ownerDocument.defaultView.SVGElement を使用してください。
次の例では、 instanceof を String オブジェクトに使用した場合の動作を示しています。
次の例では、 instanceof を Map オブジェクトに使用した場合の動作を示しています。
次の例では、 instanceof を Object.create() で生成したオブジェクトに使用した場合の動作を示しています。
以下のコードは、Car オブジェクト型とそのインスタンスである myCar を生成しています。instanceof 演算子で、myCar は Car 型および Object 型であることを示します。
あるオブジェクトが特定のコンストラクターの instanceof でないことを検査するには、次のようにします。
これは実際には次のものとは異なります。
これは常に false になります。(!myCar は instanceof の前に評価されるため、常に論理値が Car のインスタンスであるかどうかを検査しようとします。)
instanceof を使用する際のよくある落とし穴は、 x instanceof C が真の場合、 x が C をコンストラクターとして作成されたと信じることです。これは真ではありません。なぜなら、 x はプロトタイプとして C.prototype を直接割り当てられて作成される可能性があるからです。この場合、コードが x から C のプライベートフィールドを読み取ろうとしても失敗します。
これ避けるために、 C に Symbol.hasInstance メソッドを追加して instanceof の動作を上書きすることができます。これにより、 in を使ったブランドチェックをすることができます。
この動作を現在のクラスに制限 したいかもしれません。そうしないと、サブクラスで誤検知が発生する可能性があるからです。
これを行うには、thisが現在のコンストラクターであるかどうかを調べることができます。
| ECMAScript® 2027 Language Specification # sec-relational-operators |
ブラウザー互換性一覧表を表示するには、JavaScript を有効にしてください。
より良いインターネットのための青写真。
このコンテンツの一部は、©1998–2026 個人の mozilla.org 協力者です。コンテンツはクリエイティブ・コモンズ・ライセンスのもとで利用できます。