「object.constructor」を使いこなせるようになる!JavaScriptオブジェクトの型判定・継承関係確認の便利テクニック
JavaScriptのobject.constructor
は、オブジェクトが生成されたコンストラクタ関数を指すプロパティです。つまり、このプロパティにアクセスすることで、そのオブジェクトがどのようなコンストラクタ関数で作られたのかを知ることができます。
使い方
const person = new Person('田中', 30);
console.log(person.constructor); // Person { name: '田中', age: 30 }
上記の例では、Person
コンストラクタを使って生成されたperson
オブジェクトのconstructor
プロパティにアクセスしています。その結果、Person
コンストラクタそのものが返されています。
注意点
- オブジェクトリテラルで生成されたオブジェクトの場合、そのオブジェクトのプロトタイプのコンストラクタ関数が返されます。
- プリミティブ型(例:
number
、string
、boolean
)にはconstructor
プロパティは存在しません。
- 継承関係の確認
- インスタンスかどうかを判定
- オブジェクトの型判定
Object.prototype.constructor
は、すべてのオブジェクトのデフォルトのコンストラクタ関数であるObject
コンストラクタ関数を指します。constructor
プロパティは、オブジェクトのプロトタイプチェーンを辿って、最初にconstructor
プロパティを持つオブジェクトまで遡って返します。
オブジェクトの型判定
function isPerson(obj) {
return obj instanceof Person; // instanceof 演算子を使う方法
return obj.constructor === Person; // constructor プロパティを使う方法
}
const person = new Person('田中', 30);
const str = 'Hello';
console.log(isPerson(person)); // true
console.log(isPerson(str)); // false
このコードでは、isPerson
関数という関数を定義しています。この関数は、引数として渡されたオブジェクトがPerson
インスタンスかどうかを判定します。判定には、instanceof
演算子とconstructor
プロパティの2つの方法があります。
インスタンスかどうかを判定
function isInstanceOf(obj, constructor) {
while (obj) {
if (obj.constructor === constructor) {
return true;
}
obj = Object.getPrototypeOf(obj);
}
return false;
}
const person = new Person('田中', 30);
const obj = {};
console.log(isInstanceOf(person, Person)); // true
console.log(isInstanceOf(person, Object)); // true
console.log(isInstanceOf(obj, Person)); // false
このコードでは、isInstanceOf
関数という関数を定義しています。この関数は、引数として渡されたオブジェクトが指定されたコンストラクタ関数のインスタンスかどうかを判定します。判定には、プロトタイプチェーンを辿っていく方法を用いています。
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + 'が鳴きました');
}
}
class Dog extends Animal {
constructor(name) {
super(name);
}
bark() {
console.log(this.name + 'が吠えました');
}
}
const dog = new Dog('ポチ');
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(dog.constructor === Dog); // true
console.log(dog.constructor === Animal); // false
このコードでは、Animal
クラスとDog
クラスという2つのクラスを定義しています。Dog
クラスはAnimal
クラスを継承しています。
コード例では、dog
というDog
クラスのインスタンスを作成しています。そして、dog
インスタンスがDog
クラスのインスタンスかどうか、Animal
クラスのインスタンスかどうかを判定しています。判定には、instanceof
演算子とconstructor
プロパティの2つの方法を用いています。
代替方法
instanceof 演算子
最も一般的な代替方法は、
instanceof
演算子を使用する方法です。これは、オブジェクトが指定されたコンストラクタのインスタンスかどうかを判定するものです。const person = new Person('田中', 30); console.log(person instanceof Person); // true
上記の例では、
person
オブジェクトがPerson
コンストラクタのインスタンスかどうかを判定しています。クラスの静的メソッド
クラスがサポートされている場合は、クラスの静的メソッドを使用して、インスタンスかどうかを判定することができます。
class Person { static isInstanceOf(obj) { return obj instanceof Person; } } const person = new Person('田中', 30); console.log(Person.isInstanceOf(person)); // true
上記の例では、
Person
クラスにisInstanceOf
という静的メソッドを定義しています。このメソッドは、引数として渡されたオブジェクトがPerson
クラスのインスタンスかどうかを判定します。Object.getPrototypeOf()
Object.getPrototypeOf()
関数を使用して、オブジェクトのプロトタイプを取得し、そのプロトタイプのconstructor
プロパティにアクセスすることで、コンストラクタ関数を取得することができます。const person = new Person('田中', 30); const constructor = Object.getPrototypeOf(person).constructor; console.log(constructor === Person); // true
上記の例では、
person
オブジェクトのプロトタイプを取得し、そのプロトタイプのconstructor
プロパティにアクセスして、Person
コンストラクタ関数を取得しています。
方法 | 利点 | 欠点 |
---|---|---|
instanceof 演算子 | シンプルでわかりやすい | クラスがサポートされていない場合は使用できない |
クラスの静的メソッド | クラス固有のロジックをカプセル化できる | 定義する必要がある |
Object.getPrototypeOf() | 汎用性が高い | やや複雑 |