Symbol.hasInstance
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2015.
Symbol.hasInstance
は静的データプロパティで、ウェルノウンシンボルである Symbol.hasInstance
を表します。instanceof
演算子は右辺オペランドに対して、コンストラクターオブジェクトがオブジェクトをそのインスタンスとして認識するかどうかを判断する際に使用されるメソッドを、このシンボルで探します。
試してみましょう
値
ウェルノウンシンボル Symbol.hasInstance
です。
Symbol.hasInstance のプロパティ属性 | |
---|---|
書込可能 | 不可 |
列挙可能 | 不可 |
設定可能 | 不可 |
解説
instanceof
演算子は、object instanceof constructor
の返値を計算するために以下のアルゴリズムを使用します。
constructor
に[Symbol.hasInstance]()
メソッドがあった場合、object
を最初のオブジェクトとして呼び出し、結果を論理値に変換して返します。constructor
がオブジェクトでない場合、またはconstructor[Symbol.hasInstance]
がnull
、undefined
、関数のいずれでもでない場合、TypeError
が発生します。- それ以外の場合、
constructor
に[Symbol.hasInstance]()
メソッドがない場合(constructor[Symbol.hasInstance]
がnull
またはundefined
)、Function.prototype[Symbol.hasInstance]()
と同じアルゴリズムを使用して結果を決定します。constructor
が関数でない場合、TypeError
が発生します。
Because all functions inherit from Function.prototype
by default, most of the time, the Function.prototype[Symbol.hasInstance]()
method specifies the behavior of instanceof
when the right-hand side is a function.
例
独自のインスタンスでの動作
たとえば、次のようにして instanceof
の独自の動作を実装することができます。
class MyArray {
static [Symbol.hasInstance](instance) {
return Array.isArray(instance);
}
}
console.log([] instanceof MyArray); // true
function MyArray() {}
Object.defineProperty(MyArray, Symbol.hasInstance, {
value(instance) {
return Array.isArray(instance);
},
});
console.log([] instanceof MyArray); // true
オブジェクトのインスタンスを確認する
instanceof
キーワードを使ってオブジェクトがクラスのインスタンスであるかどうかを確認するのと同じ方法で、Symbol.hasInstance
を使って確認することもできます。
class Animal {
constructor() {}
}
const cat = new Animal();
console.log(Animal[Symbol.hasInstance](cat)); // true
仕様書
Specification |
---|
ECMAScript Language Specification # sec-symbol.hasinstance |
ブラウザーの互換性
BCD tables only load in the browser