instanceof

概要

instanceof 演算子は、オブジェクトが自身のプロトタイプにコンストラクタの prototype プロパティを持っているかを確認します。

演算子
実装されたバージョン JavaScript 1.4
ECMAScript エディション ECMA-262 ? Edition

構文

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 を返すでしょう。これは、始めはわかりにくいかもしれませんが、スクリプトで複数のフレームやウィンドウを扱い始め、オブジェクトをあるコンテキストから別のコンテキストへ関数を経由して渡すようになると、正当かつ重要な事項になるでしょう。

Mozilla 開発者への注意点:
XPCOM を用いるコードでは instanceof に特別な効果があります: obj instanceof xpcomInterface (例えば Components.interfaces.nsIFile) は obj.QueryInterface(xpcomInterface) を呼び出し、QueryInterface が成功した場合に true を返します。このような呼び出しの副作用として、instanceof による確認の成功後に objxpcomInterface のプロパティを利用できることがあります。標準 JavaScript の環境と異なり、obj が異なるスコープ由来であっても obj instanceof xpcomInterface での確認は期待どおりに動作します。

例: StringDateObject タイプであることの実証

以下のコードは、StringDate オブジェクトが 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 を返す

例: mycarCar タイプおよび Object タイプであることの実証

以下のコードは、Car オブジェクトタイプとそのインスタンスである mycar を生成しています。instanceof 演算子で、mycarCar タイプおよび 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 を返す

関連情報

Document Tags and Contributors

Contributors to this page: ethertank, yyss
最終更新者: ethertank,