Skip to content

Commit

Permalink
Translate Function.prototype[@@hasInstance]()
Browse files Browse the repository at this point in the history
  • Loading branch information
mikecat committed Nov 5, 2023
1 parent 44cfe9d commit ff1886d
Showing 1 changed file with 76 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
title: Function.prototype[@@hasInstance]()
slug: Web/JavaScript/Reference/Global_Objects/Function/@@hasInstance
l10n:
sourceCommit: 0891bd2199fabb1ec00dfe4765019d54f21d965c
---

{{JSRef}}

{{jsxref("Function")}} インスタンスの **`[@@hasInstance]()`** メソッドは、コンストラクター関数がオブジェクトをそのコンストラクターのインスタンスの一つであると認識するかどうかを決定するデフォルトの手続きを定義します。これは、[`instanceof`](/ja/docs/Web/JavaScript/Reference/Operators/instanceof) 演算子から呼ばれます。

## 構文

```js-nolint
func[Symbol.hasInstance](value)
```

### 引数

- `value`
- : 判定を行うオブジェクトです。プリミティブ値に対しては常に `false` を返します。

### 返値

`func.prototype``value` のプロトタイプチェーン内に存在する場合は `true` を返し、そうでない場合は `false` を返します。`value` がオブジェクトではないか、`this` が関数でない場合は、常に `false` を返します。`this`[バインド済み関数](/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)である場合は、`value` およびもとになったターゲット関数における `instanceof` 判定の結果を返します。

### 例外

- {{jsxref("TypeError")}}
- : `this` がバインド済み関数ではなく、かつ `this.prototype` がオブジェクトではないとき投げられます。

## 説明

[`instanceof`](/ja/docs/Web/JavaScript/Reference/Operators/instanceof) 演算子は、右辺の値に [`[@@hasInstance]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Symbol/hasInstance) メソッドが存在する場合は、常にこのメソッドを呼びます。すべての関数はデフォルトで `Function.prototype` を継承しているので、それらはすべてこの `[@@hasInstance]()` メソッドを持ちます。そのため、ほとんどの場合、右辺が関数であれば `Function.prototype[@@hasInstance]` メソッドが `instanceof` の挙動を定義します。このメソッドは、`instanceof` 演算子のデフォルトの挙動 (`constructor``@@hasInstance` を持たないときと同じアルゴリズム) を実装します。

ほとんどのメソッドと違い、`Function.prototype[@@hasInstance]()` プロパティは設定不可能で、書込不可能です。これは、バインド済み関数のもとになったターゲット関数を取得されるのを防ぐためのセキュリティ機能です。例として、[この StackOverflow での回答](https://stackoverflow.com/questions/38215027/trying-to-understand-the-official-es6-spec-regarding-symbol-hasinstance/38215392#38215392)を参照してください。

##

### デフォルトの instanceof の挙動に戻す

このメソッドを直接呼ぶ必要が生じることはほとんどないでしょう。かわりに、このメソッドは `instanceof` 演算子から呼ばれます。以下の 2 種類の結果は通常等価であることを期待するべきです。

```js
class Foo {}
const foo = new Foo();
console.log(foo instanceof Foo === Foo[Symbol.hasInstance](foo)); // true
```

デフォルトの `instanceof` の挙動を呼び出したいが、コンストラクターにオーバーライドされた `[@@hasInstance]()` メソッドがあるかわからないとき、このメソッドを使いたくなるかもしれません。

```js
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
```

## 仕様書

{{Specifications}}

## ブラウザーの互換性

{{Compat}}

## 関連情報

- [`instanceof`](/ja/docs/Web/JavaScript/Reference/Operators/instanceof)
- {{jsxref("Symbol.hasInstance")}}

0 comments on commit ff1886d

Please sign in to comment.