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