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
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 undthis.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.
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.
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% |