JavaScriptでオブジェクトの型を判定する方法を詳しく解説します。
オブジェクトの型を判定する方法を知りたいんですが、どうしたらいいですか?
オブジェクトの型を判定するには、instanceof演算子、in演算子、isPrototypeOfメソッド、constructorプロパティを使う方法などがあります。
instanceof演算子によるオブジェクトの型判定
instanceof演算子は、オブジェクトが特定のコンストラクタのインスタンスであるかどうかを判定するために使用されます。演算子は左辺にオブジェクトを、右辺にコンストラクタを渡します。
object instanceof constructor
instanceof演算子は、指定されたコンストラクタがオブジェクトのプロトタイプチェーンに含まれているかどうかを確認します。含まれている場合、演算子はtrueを返します。それ以外の場合は、falseを返します。
次は、instanceof演算子を使ったサンプルプログラムです。
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
let myCar = new Car('Toyota', 'Camry', 2019);
console.log(myCar instanceof Car); // true
console.log(myCar instanceof Object); // true
console.log(myCar instanceof Array); // false
このサンプルでは、Carコンストラクタを使って新しいCarオブジェクトを作成します。
次に、このオブジェクトがCarコンストラクタのインスタンスであることを判定するためにinstanceof演算子を使用します。オブジェクトがCarコンストラクタのインスタンスであるため、instanceof演算子はtrueを返します。
次に、このオブジェクトがObjectコンストラクタのインスタンスであることを判定しますが、これもtrueを返します。最後に、このオブジェクトがArrayコンストラクタのインスタンスであることを判定しますが、falseを返します。
in演算子によるオブジェクトの型判定
in演算子は、オブジェクトが特定のプロパティを持っているかどうかを判定するために使用されます。演算子は、左辺にプロパティ名を、右辺にオブジェクトを渡します。
propertyName in object
in演算子は、指定されたプロパティがオブジェクトまたはそのプロトタイプチェーンに含まれているかどうかを確認します。含まれている場合、演算子はtrueを返します。それ以外の場合は、falseを返します。
次は、in演算子を使ったサンプルプログラムです。
let myCar = {
make: 'Toyota',
model: 'Camry',
year: 2019
};
console.log('make' in myCar); // true
console.log('model' in myCar); // true
console.log('color' in myCar); // false
このサンプルでは、オブジェクトリテラルを使って新しいオブジェクトを作成します。
次に、このオブジェクトが’make’プロパティを持っていることを判定するためにin演算子を使用します。オブジェクトが’make’プロパティを持っているため、in演算子はtrueを返します。
次に、このオブジェクトが’model’プロパティを持っていることを判定しますが、これもtrueを返します。最後に、このオブジェクトが’color’プロパティを持っていることを判定しますが、falseを返します。
isPrototypeOfメソッドによるオブジェクトの型判定
instanceof演算子に似たメソットとして、isPrototypeOfメソッドがあります。
isPrototypeOfメソッドは、オブジェクトが他のオブジェクトのプロトタイプチェーンに含まれているかどうかを判定するために使用されます。
prototype.isPrototypeOf(object)
isPrototypeOfメソッドは、左辺のオブジェクトが右辺のオブジェクトのプロトタイプチェーンに含まれている場合にtrueを返します。それ以外の場合は、falseを返します。
次は、isPrototypeOfメソッドを使ったサンプルプログラムです。
let car = {
make: 'Toyota',
model: 'Camry'
};
let myCar = Object.create(car);
myCar.year = 2019;
console.log(car.isPrototypeOf(myCar)); // true
このサンプルでは、まずcarオブジェクトを作成します。次に、Object.createメソッドを使って新しいオブジェクトを作成します。この新しいオブジェクトは、carオブジェクトをプロトタイプとして持ちます。
最後に、isPrototypeOfメソッドを使ってcarオブジェクトがmyCarオブジェクトのプロトタイプチェーンに含まれているかどうかを判定します。carオブジェクトがmyCarオブジェクトのプロトタイプチェーンに含まれているため、isPrototypeOfメソッドはtrueを返します。
constructorプロパティによるオブジェクトの型判定
constructorプロパティは、オブジェクトが作られたコンストラクタ関数を参照するプロパティです。
object.constructor
constructorプロパティを使って、オブジェクトがどのコンストラクタ関数によって作られたかを判定することができます。
次は、constructorプロパティを使ったサンプルプログラムです。
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
let myCar = new Car('Toyota', 'Camry', 2019);
console.log(myCar.constructor === Car); // true
このサンプルでは、まずCarというコンストラクタ関数を定義します。次にnew演算子を使ってmyCarという新しいオブジェクトを作成します。
最後に、myCarオブジェクトのconstructorプロパティとCar関数が等しいかどうかを判定します。myCarオブジェクトはCar関数によって作られたため、constructorプロパティはCar関数を参照しています。よって、myCar.constructor === Carはtrueとなります。
constructorプロパティで派生クラスを判定した場合
次は、派生クラスを判定する例です。ここでは、Carクラスを継承したSUVクラスを作ります。
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
function SUV(make, model, year, seatingCapacity) {
Car.call(this, make, model, year);
this.seatingCapacity = seatingCapacity;
}
SUV.prototype = Object.create(Car.prototype);
SUV.prototype.constructor = SUV;
let mySUV = new SUV('Toyota', 'Highlander', 2019, 7);
console.log(mySUV.constructor === SUV); // true
console.log(mySUV.constructor === Car); // false
このサンプルでは、まずCarというコンストラクタ関数を定義します。次に、SUVという派生クラスを定義します。SUVクラスはCarクラスを継承しています。最後に、new演算子を使ってmySUVという新しいオブジェクトを作成します。
次に、mySUVオブジェクトのconstructorプロパティがSUV関数を参照しているかどうか、またはCar関数を参照しているかどうかを判定します。
mySUVオブジェクトはSUV関数によって作られたため、constructorプロパティはSUV関数を参照しています。よって、mySUV.constructor === SUVはtrueとなり、mySUV.constructor === Carはfalseとなります。
リスキリングでキャリアアップしてみませんか?
リスキリング(学び直し)は、経済産業省が推奨しており、
今だけ、最大70%のキャッシュバックを受けることができます。
最大70%の給付金が出るおすすめのプログラミングスクール!
国策で予算が決められているため申し込みが多い場合は早期に終了する可能性があります!
興味のある方はすぐに確認しましょう。
この記事のまとめ
オブジェクトの型を判定する方法について解説しました。
- instanceof演算子を使った型判定
- オブジェクトが特定のコンストラクタのインスタンスであるかどうかを判定するために使用されます。
- in演算子を使った型判定
- オブジェクトが特定のプロパティを持っているかどうかを判定するために使用されます。
- isPrototypeOfメソッドを使った型判定
- オブジェクトが他のオブジェクトのプロトタイプチェーンに含まれているかどうかを判定するために使用されます。
- constructorプロパティを使った型判定
- オブジェクトがどのコンストラクタ関数によって作られたかを判定することができます。
オブジェクトの型を判定するには複数の方法があるので、用途や条件に応じて適切な方法を選ぶことが大切ですね!
オブジェクトの型判定に多彩な方法が用意されていますが、常に正確な判定ができるというわけではありません。各判定方法の使い所を理解し、適切な方法を選択することが大切です。
コメント