instanceof
演算子は、オブジェクトが自身のプロトタイプにコンストラクタの prototype
プロパティを持っているかを確認します。
構文
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
コンストラクタの 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 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; // プロトタイプチェーンをチェックして undefined が見つかるため、false を返す myString instanceof String; // true を返す newStr instanceof String; // true を返す myString instanceof Object; // true を返す myObj instanceof Object; // 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 を返す
仕様
ブラウザ実装状況
機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
基本サポート | (有) | (有) | (有) | (有) | (有) |
機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
基本サポート | (有) | (有) | (有) | (有) | (有) | (有) |