MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

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

注意事項: 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 を用いています。

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

例: 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 2017 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 で実装。

ブラウザ実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート (有) (有) (有) (有) (有)
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート (有) (有) (有) (有) (有) (有)

関連項目

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

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