instanceof 演算子は、オブジェクトが自身のプロトタイプにコンストラクタの prototype プロパティを持っているかを確認します。
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
構文
object instanceof constructor
引数
object- 確認するオブジェクト
constructor- オブジェクトに対して確認を行う関数
説明
instanceof 演算子は、object のプロトタイプチェインで constructor.prototype の存在を確認します。
// コンストラクタを定義
function C() {}
function D() {}
var o = new C();
// true。なぜなら: Object.getPrototypeOf(o) === C.prototype
o instanceof C;
// false。D.prototype は o のプロトタイプチェーンのどこにも存在しない
o instanceof D;
o instanceof Object; // true。なぜなら...
C.prototype instanceof Object // true だから。
C.prototype = {};
var o2 = new C();
o2 instanceof C; // true
// false。C.prototype は o のプロトタイプチェーンの
// どこにも存在しない
o instanceof C;
D.prototype = new C(); // 継承を使用
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true。o3のプロトタイプチェーンに C.prototype があるため。
注意事項: instanceof による確認結果はコンストラクタの prototype プロパティの変化に従って変わることがあります。また、オブジェクトのプロトタイプを Object.setPrototypeOf を用いて変更した場合や、非標準の __proto__ 疑似プロパティを用いた場合も変わりえます。
instanceof と複数のコンテキスト (例: frame や window)
異なるスコープは、別々の実行環境を持ちます。つまり、それらは別々の組み込み物 (別々のグローバルオブジェクト、別々のコンストラクタ 等々) を持ちます。これにより予期せぬ結果になる場合があります。例えば、[] instanceof window.frames[0].Array は、Array.prototype !== window.frames[0].Array であることおよび配列が以前から継承していることから false を返すでしょう。これは、始めはわかりにくいかもしれませんが、スクリプトで複数のフレームやウィンドウを扱い始め、オブジェクトをあるコンテキストから別のコンテキストへ関数を経由して渡すようになると、正当かつ重要な事項になるでしょう。
XPCOM を用いるコードでは
instanceof に特別な効果があります: obj instanceof xpcomInterface (例えば Components.interfaces.nsIFile) は obj.QueryInterface(xpcomInterface) を呼び出し、QueryInterface が成功した場合に true を返します。このような呼び出しの副作用として、instanceof による確認の成功後に obj の xpcomInterface のプロパティを利用できることがあります。標準 JavaScript の環境と異なり、obj が異なるスコープ由来であっても obj instanceof xpcomInterface での確認は期待どおりに動作します。例
例: String や Date が Object タイプであることの実証
以下のコードは、String や Date オブジェクトが Object タイプでもある (Object から派生している) ことの実証に instanceof を用いています。
また、オブジェクトリテラルを用いて作成されたオブジェクトに対する例外、つまり、prototypeがundefinedであるにも関わらず instanceof Object が true を報告する例を示します。
var simpleStr = 'This is a simple string';
var myString = new String();
var newStr = new String('String created with constructor');
var myDate = new Date();
var myObj = {};
simpleStr instanceof String; // prototypeチェーンをチェックして undefined が見つかるため、false を返す
myString instanceof String; // true を返す
newStr instanceof String; // true を返す
myString instanceof Object; // true を返す
myObj instanceof Object; // prototype が undefined であるにもかかわらず true を返す
({}) instanceof Object; // true を返す。上記と同じ
myString instanceof Date; // false を返す
myDate instanceof Date; // true を返す
myDate instanceof Object; // true を返す
myDate instanceof String; // false を返す
例: mycar が Car タイプおよび Object タイプであることの実証
以下のコードは、Car オブジェクトタイプとそのインスタンスである mycar を生成しています。instanceof 演算子で、mycar は Car タイプおよび Object タイプであることを実証します。
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
var mycar = new Car("Honda", "Accord", 1998);
var a = mycar instanceof Car; // true を返す
var b = mycar instanceof Object; // true を返す
仕様
| 仕様 | ステータス | コメント |
|---|---|---|
| ECMAScript (ECMA-262) Relational Operators の定義 |
現行の標準 | |
| ECMAScript 2015 (6th Edition, ECMA-262) Relational Operators の定義 |
標準 | |
| ECMAScript 5.1 (ECMA-262) The instanceof operator の定義 |
標準 | |
| ECMAScript 3rd Edition (ECMA-262) The instanceof operator の定義 |
標準 | 初期定義。JavaScript 1.4 で実装。 |
ブラウザーの対応
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
instanceof | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 5 | Opera 完全対応 4 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.1.100 |
凡例
- 完全対応
- 完全対応