Function.prototype[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 2017年4月.
[Symbol.hasInstance]() は Function インスタンスのメソッドで、コンストラクター関数がオブジェクトをそのコンストラクターのインスタンスの一つであると認識するかどうかを決定するデフォルトの手続きを定義します。これは、instanceof 演算子から呼ばれます。
構文
func[Symbol.hasInstance](value)
引数
value-
判定を行うオブジェクトです。プリミティブ値に対しては常に
falseを返します。
返値
func.prototype が value のプロトタイプチェーン内に存在する場合は true を返し、そうでない場合は false を返します。value がオブジェクトではないか、this が関数でない場合は、常に false を返します。this がバインド済み関数である場合は、value およびもとになったターゲット関数における instanceof 判定の結果を返します。
例外
TypeError-
thisがバインド済み関数ではなく、かつthis.prototypeがオブジェクトではないとき投げられます。
説明
instanceof 演算子は、右辺の値に [Symbol.hasInstance]() メソッドが存在する場合は、常にこのメソッドを呼びます。すべての関数はデフォルトで Function.prototype を継承しているので、それらはすべてこの [Symbol.hasInstance]() メソッドを持ちます。そのため、ほとんどの場合、右辺が関数であれば Function.prototype[Symbol.hasInstance] メソッドが instanceof の挙動を定義します。このメソッドは、instanceof 演算子のデフォルトの挙動 (constructor が @@hasInstance を持たないときと同じアルゴリズム) を実装します。
ほとんどのメソッドと違い、Function.prototype[Symbol.hasInstance]() プロパティは設定不可能で、書込不可能です。これは、バインド済み関数のもとになったターゲット関数を取得されるのを防ぐためのセキュリティ機能です。例として、この StackOverflow での回答を参照してください。
例
>デフォルトの instanceof の挙動に戻す
このメソッドを直接呼ぶ必要が生じることはほとんどないでしょう。かわりに、このメソッドは instanceof 演算子から呼ばれます。以下の 2 種類の結果は通常等価であることを期待するべきです。
class Foo {}
const foo = new Foo();
console.log(foo instanceof Foo === Foo[Symbol.hasInstance](foo)); // true
デフォルトの instanceof の挙動を呼び出したいが、コンストラクターにオーバーライドされた [Symbol.hasInstance]() メソッドがあるかわからないとき、このメソッドを使いたくなるかもしれません。
class Foo {
static [Symbol.hasInstance](value) {
// 独自の実装
return false;
}
}
const foo = new Foo();
console.log(foo instanceof Foo); // false
console.log(Function.prototype[Symbol.hasInstance].call(Foo, foo)); // true
仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-function.prototype-%symbol.hasinstance%> |
ブラウザーの互換性
Loading…