instanceof

オブジェクトがそのprototypeチェーン内に、指定したコンストラクタのprototypeのプロパティを持つかを検証します。

文法

object instanceof constructor
パラメーター 説明
object 検証するオブジェクトを指定します。
constructor 検証対象となる関数を指定します。

説明

instanceof演算子は、 オブジェクトのprototypeチェーン内のconstructor.prototype存在を検証します。

// コンストラクタの定義
function C(){}
function D(){}

var o = new C();

// trueです。
// 何故なら、Object.getPrototypeOf(o) === C.prototypeだからです。
o instanceof C;

// falseです。
// 何故なら、oのprototypeチェーン内の何処にも存在しないからです。
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のprototypeチェーンの何処にも存在しないからです。
o instanceof C;

D.prototype = new C(); // 継承を使用
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true

もし、instanceofの値の検証が、コンストラクタのprototypeプロパティの変更を基にして変更出来る場合でも、 それはオブジェクトのprototypeの変更では変更出来ない事に注意してください。 何故なら、オブジェクトのprototypeの変更は、標準のECMAScriptは不可能だからです。 ただし、非標準の__proto__擬似プロパティを使用すれば、 それが可能になります。

instanceofと複数のコンテキスト(例: フレームやウインドウ)について

異なるスコープは異なる実行環境を持ち、 これは異なるビルトインを持つ事を意味します。(異なるグローバルオブジェクト、異なるコンストラクト、等) これにより、期待した結果が得られないことがあります。 例えば、[] instanceof window.frames[0].Arrayは、falseを返します。 何故ならArray.prototype !== window.frames[0].Arrayであり、配列は前者から継承しないためです。

これについて考察することは最初は意味が無いと思われるかもしれませんが、 あなたがスクリプト内で複数のフレームまたはウインドウを扱い始め、 あるコンテキストから別のコンテキストへ関数を通してオブジェクトを渡すようになると、 この事が有効且つ重要な課題になります。 例えば、もし実際のArray内にオブジェクトが与えられた場合、 Array.isArray(myObj)を使用してセキュリティ確認をする事が考えられます。

Mozilla開発者への注意: XPCOMのinstanceofを使用したコードには、特別な効果があります。 obj instanceof xpcomInterface(例: Components.interfaces.nsIFile)は、 obj.QueryInterface(xpcomInterface)を呼び出し、もしQueryInterfaceが成功すればtrueを返します。 そのような呼び出しの副作用として、instanceofの検証が成功した後に、 objのxpcomInterfaceプロパティを使用することが可能になります。 標準のJavaScriptのグローバルとは異なり、 obj instanceof xpcomInterfaceの検証は、 異なるスコープからのobjであっても期待通りに動作します。

例: StringとDateはObject型であることのデモと例外ケースについて

下記のコードはinstanceofを使用して、 StringDateがオブジェクト型でもあることを、 デモによって示しています。(それらは、Objectから派生しています)

ただし、オブジェクトリテラルの表記で作成されたオブジェクトは、ここでは例外扱いとなります。 prototypeはundefinedですが、instanceof Objectはtrueを返します。

var simpleStr = "単純な文字列";
var myString  = new String();
var newStr    = new String("コンストラクタによって作成された文字列");
var myDate    = new Date();
var myObj     = {};

simpleStr instanceof String; // returns false, prototypeを確認し、undefinedが見つかります。
myString  instanceof String; // returns true
newStr    instanceof String; // returns true
myString  instanceof Object; // returns true

myObj instanceof Object;    // returns true, 未定義のprototypeにも関わらず
({})  instanceof Object;    // returns true, 上記に同じ

myString instanceof Date;   // returns false

myDate instanceof Date;     // returns true
myDate instanceof Object;   // returns true
myDate instanceof String;   // returns 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;    // returns true
var b = mycar instanceof Object; // returns true

仕様

ブラウザ互換性

デスクトップ
機能 Chrome Firefox
(Gecko)
IE Opera Safari
基本
モバイル
機能 Android Chrome for
Android
Firefox
Mobile
IE
Mobile
Opera
Mobile
Safari
Mobile
基本

関連項目

 Back to top

© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.

このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
  • 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
  • MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。