Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.
Die constructor Dateneigenschaft einer Object-Instanz gibt eine Referenz auf die Konstruktorfunktion zurück, die das Instanzobjekt erstellt hat. Beachten Sie, dass der Wert dieser Eigenschaft eine Referenz auf die Funktion selbst ist und nicht ein String, der den Namen der Funktion enthält.
Hinweis: Dies ist eine Eigenschaft von JavaScript-Objekten. Für die constructor-Methode in Klassen, siehe die eigene Referenzseite.
Eine Referenz auf die Konstruktorfunktion, die das Instanzobjekt erstellt hat.
| Schreibbar | ja |
| Aufzählbar | nein |
| Konfigurierbar | ja |
Hinweis: Diese Eigenschaft wird standardmäßig auf der prototype-Eigenschaft jeder Konstruktorfunktion erstellt und wird von allen Objekten geerbt, die mit diesem Konstruktor erzeugt werden.
Jedes Objekt (mit Ausnahme der null Prototyp-Objekte) wird eine constructor-Eigenschaft auf seinem [[Prototype]] haben. Objekte, die mit Literalen erstellt wurden, werden ebenfalls eine constructor-Eigenschaft haben, die auf den Konstruktortyp für dieses Objekt verweist — zum Beispiel erstellen Array-Literale Array-Objekte, und Objektliterale erstellen einfache Objekte.
Beachten Sie, dass constructor normalerweise von der prototype-Eigenschaft des Konstruktors stammt. Wenn Sie eine längere Prototypen-Kette haben, können Sie normalerweise erwarten, dass jedes Objekt in der Kette eine constructor-Eigenschaft hat.
Das folgende Beispiel erstellt einen Konstruktor (Tree) und ein Objekt dieses Typs (theTree). Das Beispiel zeigt dann die constructor-Eigenschaft für das Objekt theTree an.
Dieses Beispiel zeigt die folgende Ausgabe:
theTree.constructor is function Tree(name) { this.name = name; }Man kann die constructor-Eigenschaft von Nicht-Primitiven zuweisen.
Dies überschreibt nicht die alte constructor-Eigenschaft — sie war ursprünglich im [[Prototype]] der Instanz vorhanden, nicht als eigene Eigenschaft.
Aber selbst wenn Object.getPrototypeOf(a).constructor neu zugewiesen wird, ändert das nicht andere Verhaltensweisen des Objekts. Zum Beispiel wird das Verhalten von instanceof durch Symbol.hasInstance und nicht durch constructor gesteuert:
Es gibt nichts, was die constructor-Eigenschaft davor schützt, neu zugewiesen oder überschattet zu werden, daher sollte sie vermieden werden, um den Typ einer Variablen zu erkennen. Weniger fehleranfällige Methoden wie instanceof und Symbol.toStringTag für Objekte oder typeof für Primitive sollten bevorzugt werden.
Jeder Konstruktor hat eine prototype-Eigenschaft, die beim Aufruf über den new-Operator zum [[Prototype]] der Instanz wird. ConstructorFunction.prototype.constructor wird daher, wie zuvor demonstriert, eine Eigenschaft auf dem [[Prototype]] der Instanz.
Wenn jedoch ConstructorFunction.prototype neu zugewiesen wird, geht die constructor-Eigenschaft verloren. Zum Beispiel ist dies eine übliche Methode, um ein Vererbungsmuster zu erstellen:
Der constructor von Instanzen von Child wird Parent sein, da Child.prototype neu zugewiesen wurde.
Dies ist normalerweise kein großes Problem — die Sprache greift fast nie auf die constructor-Eigenschaft eines Objekts zu. Die einzige Ausnahme ist die Verwendung von [Symbol.species], um neue Instanzen einer Klasse zu erstellen, aber solche Fälle sind selten und Sie sollten ohnehin die extends-Syntax verwenden, um eingebaute Klassen zu unterklassen.
Stellen Sie jedoch sicher, dass Child.prototype.constructor immer auf Child selbst verweist, wenn ein Aufrufer constructor verwendet, um von einer Instanz auf die ursprüngliche Klasse zuzugreifen. Betrachten Sie den folgenden Fall: Das Objekt hat die Methode create(), um sich selbst zu erstellen.
Im obigen Beispiel wird eine Ausnahme ausgelöst, da der constructor auf Parent verweist. Um dies zu vermeiden, weisen Sie einfach den notwendigen Konstruktor zu, den Sie verwenden möchten.
Beachten Sie, dass es entscheidend ist, beim manuellen Hinzufügen der constructor-Eigenschaft die Eigenschaft nicht aufzählbar zu machen, damit constructor nicht in for...in-Schleifen besucht wird — wie es normalerweise der Fall ist.
Wenn der obige Code wie zu viel Boilerplate aussieht, können Sie auch in Betracht ziehen, Object.setPrototypeOf() zu verwenden, um die Prototypenkette zu manipulieren.
Object.setPrototypeOf() hat potenzielle Leistungseinbußen, da alle zuvor erstellten Objekte, die in der Prototypenkette beteiligt sind, neu kompiliert werden müssen; aber wenn der obige Initialisierungscode vor der Erstellung von Parent oder CreatedConstructor erfolgt, sollte der Effekt minimal sein.
Betrachten wir noch einen komplexeren Fall.
Damit dieses Beispiel richtig funktioniert, können wir die statischen Eigenschaften von Parent auf Child neu zuweisen:
Aber noch besser, wir können die Konstruktorfunktionen selbst wie Klassen mit extends voneinander erben lassen.
Auch hier kann die Verwendung von Object.setPrototypeOf() negative Leistungseffekte haben, stellen Sie daher sicher, dass es direkt nach der Konstruktor-Deklaration und vor der Erstellung von Instanzen passiert — um zu vermeiden, dass Objekte "verunreinigt" werden.
Hinweis: Das manuelle Aktualisieren oder Setzen des Konstruktors kann zu unterschiedlichen und manchmal verwirrenden Konsequenzen führen. Um dies zu vermeiden, definieren Sie einfach die Rolle von constructor in jedem spezifischen Fall. In den meisten Fällen wird constructor nicht verwendet und eine Neuzuweisung ist nicht erforderlich.
| ECMAScript® 2027 Language Specification # sec-object.prototype.constructor |
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
Der Bauplan für ein besseres Internet.
Besuche die gemeinnützige Muttergesellschaft der Mozilla Corporation, die Mozilla Foundation.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.