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 September 2016 browserübergreifend verfügbar.
Die Reflect.construct() statische Methode funktioniert ähnlich wie der new Operator, jedoch als Funktion. Sie ist gleichbedeutend mit dem Aufruf von new target(...args). Zusätzlich erlaubt sie es, einen anderen new.target Wert anzugeben.
Die Ziel-Funktion, die aufgerufen werden soll.
argumentsListEin array-ähnliches Objekt, das die Argumente enthält, mit denen target aufgerufen werden soll.
newTarget OptionalDer Wert des new.target Ausdrucks innerhalb von target. Standardmäßig target. Im Allgemeinen (siehe Beispiel), spezifiziert target die Logik zur Initialisierung des Objekts, während newTarget.prototype das Prototype des konstruierten Objekts angibt.
Eine neue Instanz von target (oder newTarget, falls angegeben), initialisiert durch target als Konstruktor mit der gegebenen argumentsList.
Wird ausgelöst, wenn target oder newTarget kein Konstruktor ist oder wenn argumentsList kein Objekt ist.
Reflect.construct() bietet die reflektive Semantik eines Konstruktoraufrufs. Das heißt, Reflect.construct(target, argumentsList, newTarget) ist semantisch gleichwertig mit:
Beachten Sie, dass bei der Verwendung des new Operators target und newTarget immer derselbe Konstruktor sind — aber Reflect.construct() erlaubt es Ihnen, einen anderen new.target Wert zu übergeben. Konzeptionell ist newTarget die Funktion, auf die new angewendet wurde, und newTarget.prototype wird zum Prototyp des konstruierten Objekts, während target der eigentliche Konstruktor ist, der zur Initialisierung des Objekts ausgeführt wird. Zum Beispiel kann new.target auch von dem aktuell ausgeführten Konstruktor in der Klassenvererbung abweichen.
Reflect.construct() ermöglicht es Ihnen, einen Konstruktor mit einer variablen Anzahl von Argumenten aufzurufen. (Dies ist auch mit der Spread-Syntax in einem normalen Konstruktoraufruf möglich.)
Reflect.construct() ruft die [[Construct]] objektinterne Methode von target auf.
Wenn newTarget übergeben wird, ändert sich der Wert von new.target innerhalb des Konstruktors. Das konstruierte Objekt wird eine Instanz von newTarget, nicht von target.
Natürlich gibt es keine starke Garantie über die Prototypenkette des konstruierten Objekts, da dies von der Implementierung des Konstruktors abhängt. Zum Beispiel, wenn der target Konstruktor ein Objekt zurückgibt, dann wird dieses Objekt zum konstruierten Objekt, unabhängig vom newTarget Wert. Wenn target ein Proxy mit einer construct-Falle ist, dann kontrolliert die Falle vollständig den Konstruktionsvorgang.
Ein gültiges new.target sollte eine Konstruktorfunktion mit einer prototype Eigenschaft sein, aber Letzteres wird nicht erzwungen. Wenn der Wert der prototype-Eigenschaft kein Objekt ist, wird das initialisierte Objekt von Object.prototype erben.
Vor der Einführung von Reflect konnten Objekte mit einer beliebigen Kombination von Konstruktoren und Prototypen unter Verwendung von Object.create() konstruiert werden.
Während das Endergebnis dasselbe ist, gibt es einen wichtigen Unterschied im Prozess. Wenn Object.create() und Function.prototype.apply() verwendet werden, zeigt der new.target Operator innerhalb der für den Konstruktor verwendeten Funktion auf undefined, da das new Schlüsselwort nicht zum Erstellen des Objekts verwendet wird. (Tatsächlich wird die apply Semantik, nicht construct, verwendet, obwohl normale Funktionen fast gleich funktionieren.)
Auf der anderen Seite, wenn Reflect.construct() aufgerufen wird, zeigt der new.target Operator auf den newTarget Parameter, wenn angegeben, oder auf target, falls nicht.
| ECMAScript® 2027 Language Specification # sec-reflect.construct |
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
Der Bauplan für ein besseres Internet.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.