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 やクロスフレームのオブジェクトに関して注意が必要です。