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
を使用して、
String
とDate
がオブジェクト型でもあることを、
デモによって示しています。(それらは、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 |
---|---|---|---|---|---|---|
基本 | ◯ | ◯ | ◯ | ◯ | ◯ | ◯ |
関連項目
© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。
- 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
- 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
- MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
- "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。