2022年4月27日

クラスのチェック: "instanceof"

instanceof 演算子でオブジェクトが特定のクラスに属しているのかを確認することができます。また、継承も考慮されます。

このようなチェックが必要なケースは多々あるかもしれません。ここでは、その型に応じて引数を別々に扱う 多形(ポリモーフィック) 関数を構築するために使用します。

instanceof 演算子

構文は次の通りです:

obj instanceof Class

それは objClass (または、それを継承しているクラス)に属している場合に true を返します。

例:

class Rabbit {}
let rabbit = new Rabbit();

// Rabbit クラスのオブジェクト?
alert( rabbit instanceof Rabbit ); // true

コンストラクタ関数でも動作します。:

// class の代わり
function Rabbit() {}

alert( new Rabbit() instanceof Rabbit ); // true

…また Array のような組み込みクラスでも動作します。:

let arr = [1, 2, 3];
alert( arr instanceof Array ); // true
alert( arr instanceof Object ); // true

arrObject クラスにも属していることに留意してください。Array はプロトタイプ的に Object を継承しているためです。

通常、instanceof 演算子はチェックのためにプロトタイプチェーンを検査します。この動きに対して、静的メソッド Symbol.hasInstance でカスタムロジックが設定できます。

obj instanceof Class のアルゴリズムはおおまかに次のように動作します。:

  1. もし静的メソッド Symbol.hasInstance があれば、それ(Class[Symbol.hasInstance](obj))を使います。これは true または false を返す必要があり、これで instanceof