概要
instanceof 演算子は、オブジェクトが自身のプロトタイプにコンストラクタの prototype プロパティを持っているかを確認します。
構文
object instanceof constructor
引数
object- 確認するオブジェクト
constructor- オブジェクトに対して確認を行う関数
説明
instanceof 演算子は、object のプロトタイプチェインで constructor.prototype の存在を確認します。
function C(){} // コンストラクタを定義
function D(){} // 別のコンストラクタを定義
var o = new C();
o instanceof C; // true、Object.getPrototypeOf(o) === C.prototype であるからです
o instanceof D; // false、D.prototype は o のプロトタイプチェインに存在しないからです
o instanceof Object; // true
C.prototype instanceof Object // true
C.prototype = {};
var o2 = new C();
o2 instanceof C; // true
o instanceof C; // false、なぜなら o のプロトタイプチェインに C.prototype が存在しなくなったためです
D.prototype = new C(); // 継承を使用
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true
コンストラクタの prototype プロパティの変化に基づいて instanceof による確認結果を変えてよい場合でも、標準 ECMAScript ではオブジェクトのプロトタイプの変更ができないため、オブジェクトのプロトタイプの変更により結果を変更できないことに注意してください。ただし、非標準の __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 を用いています。
var myString = new String(); var myDate = new Date(); myString instanceof String; // true を返す myString 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 を返す

