JavaScript/instanceof
instanceof
編集instanceof
は、JavaScriptにおいてオブジェクトが特定のコンストラクタのインスタンスであるかどうかを判定する演算子です。オブジェクトが指定したクラスのインスタンスであれば true
を返し、それ以外の場合は false
を返します。
基本構文
編集object instanceof constructor
- object: 判定したいオブジェクト。
- constructor: 判定対象のコンストラクタ関数。クラスのコンストラクタなど。
戻り値
編集instanceof
は、指定されたオブジェクトが指定されたコンストラクタまたはそのサブクラスのインスタンスであれば true
を、そうでなければ false
を返します。
使用例
編集// 基本的な使用例 const arr = [1, 2, 3]; console.log(arr instanceof Array); // true console.log(arr instanceof Object); // true function Person(name) { this.name = name; } const john = new Person("John"); console.log(john instanceof Person); // true console.log(john instanceof Object); // true
プロトタイプチェーンとの関係
編集instanceof
演算子は、オブジェクトのプロトタイプチェーンを辿って、指定されたコンストラクタのプロトタイプオブジェクトがそのチェーンに存在するかどうかを確認します。このため、サブクラスのインスタンスに対しても、親クラスの instanceof
チェックが成功します。
function Animal(name) { this.name = name; } function Dog(name) { Animal.call(this, name); } Dog.prototype = Object.create(Animal.prototype); const rover = new Dog("Rover"); console.log(rover instanceof Dog); // true console.log(rover instanceof Animal); // true
注意点
編集- コンストラクタ関数:
instanceof
は関数のコンストラクタを基準にオブジェクトがインスタンスかどうかを判定します。クラスを使ったオブジェクト指向の構造でも同様に機能します。 - null と instanceof:
null
はどのオブジェクトのインスタンスでもないため、instanceof
は常にfalse
を返します。
console.log(null instanceof Object); // false
- クロスフレームの問題: 異なる実行コンテキスト(例えば、異なるウィンドウやiframe)間で作成されたオブジェクトに対しては、
instanceof
が正しく動作しない場合があります。この問題は、異なるフレーム間でプロトタイプチェーンが異なるためです。
他の型判定方法との比較
編集instanceof
はオブジェクトのインスタンスを判定するために非常に有効ですが、他の方法も考慮する必要があります。
typeof
:typeof
はプリミティブ型や関数の型を判定するのに使用され、instanceof
とは異なり、オブジェクトのインスタンスを直接判定することはできません。Object.prototype.toString.call()
: より詳細な型判定が必要な場合、Object.prototype.toString.call()
を使用することができます。これは、オブジェクトがどのクラスに属しているかを文字列として判定します。
// 使用例 console.log(typeof arr); // "object" console.log(Object.prototype.toString.call(arr)); // "[object Array]"
まとめ
編集instanceof
はオブジェクトが特定のコンストラクタのインスタンスであるかどうかを判定します。- プロトタイプチェーンを辿るため、サブクラスのインスタンスでも親クラスの判定ができます。
null
やクロスフレームのオブジェクトに関して注意が必要です。