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 July 2015.

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

Syntax

js
func[Symbol.hasInstance](value)

Parameter

value

Das zu testende Objekt. Primitive Werte geben immer false zurück.

Rückgabewert

true, wenn func.prototype in der Prototypenkette von value enthalten ist; andernfalls false. Gibt immer false zurück, wenn value kein Objekt ist oder this keine Funktion ist. Wenn this eine gebundene Funktion ist, gibt das Ergebnis eines instanceof-Tests mit value und der zugrundeliegenden Zielfunktion zurück.

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, wann immer eine solche Methode existiert. Da alle Funktionen standardmäßig von Function.prototype erben, haben sie alle die [Symbol.hasInstance]() Methode, sodass die meiste Zeit die Function.prototype[Symbol.hasInstance]() Methode das Verhalten von instanceof bestimmt, wenn die rechte Seite eine Funktion ist. Diese Methode implementiert das Standardverhalten des instanceof Operators (den gleichen Algorithmus, wenn constructor keine [Symbol.hasInstance]() Methode hat).

Im Gegensatz zu den meisten Methoden ist die Function.prototype[Symbol.hasInstance]() Eigenschaft nicht konfigurierbar und nicht schreibbar. Dies ist ein Sicherheitsmerkmal, um zu verhindern, dass die zugrundeliegende Zielfunktion einer gebundenen Funktion zugänglich ist. Siehe diese Antwort auf StackOverflow für ein Beispiel.

Beispiele

Rückkehr zum Standardverhalten von instanceof

Sie würden diese Methode selten direkt aufrufen müssen. Stattdessen wird diese Methode vom instanceof Operator aufgerufen. Sie sollten erwarten, dass die beiden Ergebnisse in der Regel gleichwertig sind.

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

Sie möchten diese Methode möglicherweise verwenden, wenn Sie das Standardverhalten von instanceof aufrufen möchten, aber nicht wissen, ob ein Konstruktor eine überschreibene [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 Language Specification
# sec-function.prototype-%symbol.hasinstance%

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch