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。o3のプロトタイプチェーンに C.prototype があるため。

注意事項: instanceof による確認結果はコンストラクタの prototype プロパティの変化に従って変わることがあります。また、オブジェクトのプロトタイプを Object.setPrototypeOf を用いて変更した場合や、非標準の __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 を用いています。

また、オブジェクトリテラルを用いて作成されたオブジェクトに対する例外、つまり、prototypeがundefinedであるにも関わらず instanceof Objecttrue を報告する例を示します。

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 を返す

例: 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 を返す

仕様

仕様 ステータス コメント
ECMAScript Latest Draft (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 で実装。

ブラウザーの対応

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応 あり あり1 あり あり あり
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応 あり あり あり4 あり あり あり

関連項目

ドキュメントのタグと貢献者

このページの貢献者: sutara79, woodmix, mandel59, YuichiNukiyama, teoli, ethertank, yyss
最終更新者: sutara79,