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 April 2017.

Die Methode [Symbol.hasInstance]() von Function-Instanzen legt das Standardverfahren fest, um zu bestimmen, ob eine Konstruktorfunktion ein Objekt als Instanz des Konstruktors erkennt. Sie wird vom instanceof-Operator aufgerufen.

Syntax

js
func[Symbol.hasInstance](value)

Parameter

value

Das Objekt, das getestet werden soll. Primitive Werte liefern immer false.

Rückgabewert

true, wenn func.prototype in der Prototyp-Kette von value ist; andernfalls false. Liefert immer false, wenn value kein Objekt ist oder this keine Funktion ist. Wenn this eine gebundene Funktion ist, liefert es das Ergebnis eines instanceof-Tests auf value und die zugrunde liegende Zielfunktion.

Ausnahmen

TypeError

Wird ausgelöst, wenn this keine gebundene Funktion ist und this.prototype kein Objekt ist.

Beschreibung

Der instanceof-Operator ruft die [Symbol.hasInstance]()-Methode der rechten Seite auf, wenn eine solche Methode existiert. Da alle Funktionen standardmäßig von Function.prototype erben, haben sie alle die [Symbol.hasInstance]()-Methode, sodass meist die Methode Function.prototype[Symbol.hasInstance]() das Verhalten von instanceof festlegt, wenn die rechte Seite eine Funktion ist. Diese Methode implementiert das Standardverhalten des instanceof-Operators (der gleiche Algorithmus, wenn constructor keine [Symbol.hasInstance]()-Methode hat).

Im Gegensatz zu den meisten Methoden ist die Eigenschaft Function.prototype[Symbol.hasInstance]() nicht konfigurierbar und nicht beschreibbar. Dies ist ein Sicherheitsmerkmal, um zu verhindern, dass die zugrunde liegende Zielfunktion einer gebundenen Funktion abgerufen wird. Siehe dieses Stack Overflow-Antwort für ein Beispiel.

Beispiele

Rückkehr zum Standard-instanceof-Verhalten

Sie müssten diese Methode selten direkt aufrufen. Stattdessen wird diese Methode vom instanceof-Operator aufgerufen. Sie sollten erwarten, dass die beiden Ergebnisse normalerweise gleichwertig sind.

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

Es kann sein, dass Sie diese Methode verwenden möchten, wenn Sie das Standardverhalten von instanceof aufrufen möchten, aber nicht wissen, ob ein Konstruktor eine überschreibende [Symbol.hasInstance]()-Methode hat.

js
class Foo {
  static [Symbol.hasInstance](value) {
    // A custom implementation
    return false;
  }
}

const foo = new Foo();
console.log(foo instanceof Foo); // false
console.log(Function.prototype[Symbol.hasInstance].call(Foo, foo)); // true

Spezifikationen

Specification
ECMAScript® 2026 Language Specification
# sec-function.prototype-%symbol.hasinstance%

Browser-Kompatibilität

Siehe auch