instanceof演算子を使ったオブジェクトの型判定とその活用方法をわかりやすく解説

スポンサーリンク
スポンサーリンク

instanceofの概要

オブジェクトの型判定 JavaScript予約語

instanceof

概要 instanceof演算子は、オブジェクトが特定のクラスまたはコンストラクタ関数のインスタンスであるかを判定するために使用されます。判定結果はブール値(trueまたはfalse)を返します。

わかりやすく説明 instanceofは「このオブジェクトは特定の設計図(クラスや関数)から作られたものかどうか」を確認する道具です。

  • プロトタイプチェーンを利用して型を判定します。
  • クラスだけでなく、カスタムコンストラクタ関数にも対応します。
  • 型チェックの基本演算子として広く使われます。

instanceofの基本的な使い方

以下は、instanceofを使用した基本的な例です。

// クラスを使ったinstanceofの例
class Person {}
const alice = new Person();

console.log(alice instanceof Person); // true
console.log(alice instanceof Object); // true

// コンストラクタ関数を使った例
function Animal() {}
const dog = new Animal();

console.log(dog instanceof Animal); // true
console.log(dog instanceof Object); // true

// 配列の判定
const numbers = [1, 2, 3];
console.log(numbers instanceof Array); // true
console.log(numbers instanceof Object); // true
  • オブジェクトが特定のクラスやコンストラクタ関数に基づいて生成されたかを判定します。
  • すべてのオブジェクトはObjectを継承しているため、instanceof Objectは常にtrueを返します。

カスタム型チェックの応用例

instanceofを使用して、特定の型に基づく処理を実装できます。

// 型に基づく処理の分岐
class Circle {
    constructor(radius) {
        this.radius = radius;
    }
}

class Rectangle {
    constructor(width, height) {
        this.width = width;
        this.height = height;
    }
}

function calculateArea(shape) {
    if (shape instanceof Circle) {
        return Math.PI * shape.radius ** 2;
    } else if (shape instanceof Rectangle) {
        return shape.width * shape.height;
    } else {
        throw new Error("不明な形状です");
    }
}

const circle = new Circle(5);
const rectangle = new Rectangle(10, 20);

console.log(calculateArea(circle)); // 78.53981633974483
console.log(calculateArea(rectangle)); // 200
  • オブジェクトの型に基づいて異なる処理を実行できます。
  • カスタムクラスや標準クラス(例: Array)にも適用可能です。

注意点

  • プロトタイプチェーンに依存: instanceofはオブジェクトのプロトタイプチェーンを辿るため、プロトタイプが変更されると結果が変わる場合があります。
  • プリミティブ型には使用不可: instanceofはオブジェクトの型チェック専用です。プリミティブ型(例: string, number)では使用できません。
  • 異なるグローバルコンテキスト: 異なるwindowオブジェクト間でinstanceofを使うと、期待通りに動作しない場合があります。

よくある質問

Q: instanceofの代わりにtypeofを使うことはできますか?
A: typeofはプリミティブ型の判定には適していますが、オブジェクトやクラスの型チェックにはinstanceofを使用します。
Q: なぜinstanceofがオブジェクトを判定できるのですか?
A: instanceofはオブジェクトのプロトタイプチェーンを辿り、指定したコンストラクタのprototypeが一致するかを確認します。
Q: プロトタイプチェーンを変更するとinstanceofはどうなりますか?
A: プロトタイプチェーンを変更すると、instanceofの結果が変わります。カスタムプロトタイプを使用する際には注意が必要です。

まとめ

instanceof演算子は、オブジェクトの型を判定するための重要なツールです。プロトタイプチェーンを基に判定を行い、型安全なプログラム設計をサポートします。

  • クラスやコンストラクタ関数に基づいてオブジェクトの型を確認できます。
  • 型に応じた処理を実装する場合に便利です。
  • プリミティブ型の判定にはtypeofを使用し、オブジェクトにはinstanceofを活用してください。