Symbol.hasInstance
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit April 2017 browserübergreifend verfügbar.
Die statische Dateneigenschaft Symbol.hasInstance repräsentiert das bekannte Symbol Symbol.hasInstance. Der instanceof-Operator sucht dieses Symbol im rechten Operanden nach der Methode, die verwendet wird, um festzustellen, ob das Konstruktorobjekt ein Objekt als seine Instanz erkennt.
Probieren Sie es aus
class Array1 {
static [Symbol.hasInstance](instance) {
return Array.isArray(instance);
}
}
console.log([] instanceof Array1);
// Expected output: true
Wert
Das bekannte Symbol Symbol.hasInstance.
Eigenschaften von Symbol.hasInstance | |
|---|---|
| Schreibbar | nein |
| Aufzählbar | nein |
| Konfigurierbar | nein |
Beschreibung
Der instanceof-Operator verwendet den folgenden Algorithmus, um den Rückgabewert von object instanceof constructor zu berechnen:
- Wenn
constructoreine[Symbol.hasInstance]()-Methode hat, dann rufen Sie diese mitobjectals erstem Argument auf und geben das Ergebnis zurück, umgewandelt in einen Boolean. Werfen Sie einenTypeError, wennconstructorkein Objekt ist oder wennconstructor[Symbol.hasInstance]wedernull,undefinednoch eine Funktion ist. - Andernfalls, wenn
constructorkeine[Symbol.hasInstance]()-Methode hat (constructor[Symbol.hasInstance]istnulloderundefined), dann bestimmen Sie das Ergebnis mit dem gleichen Algorithmus wieFunction.prototype[Symbol.hasInstance](). Werfen Sie einenTypeError, wennconstructorkeine Funktion ist.
Da alle Funktionen standardmäßig von Function.prototype erben, legt die Function.prototype[Symbol.hasInstance]()-Methode meist das Verhalten von instanceof fest, wenn die rechte Seite eine Funktion ist.
Beispiele
>Benutzerdefiniertes instanceof-Verhalten
Sie können Ihr benutzerdefiniertes instanceof-Verhalten so implementieren, zum Beispiel:
class MyArray {
static [Symbol.hasInstance](instance) {
return Array.isArray(instance);
}
}
console.log([] instanceof MyArray); // true
function MyArray() {}
Object.defineProperty(MyArray, Symbol.hasInstance, {
value(instance) {
return Array.isArray(instance);
},
});
console.log([] instanceof MyArray); // true
Überprüfung der Instanz eines Objekts
Genau wie Sie überprüfen können, ob ein Objekt eine Instanz einer Klasse ist, indem Sie das instanceof-Schlüsselwort verwenden, können wir auch Symbol.hasInstance für solche Überprüfungen verwenden.
class Animal {
constructor() {}
}
const cat = new Animal();
console.log(Animal[Symbol.hasInstance](cat)); // true
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-symbol.hasinstance> |