instanceofの概要
| オブジェクトの型判定 JavaScript予約語 | ||
|
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を活用してください。