[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Reflect/construct [Back]  [Original]

Reflect.construct() - JavaScript | MDN

Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.

View in English Always switch to English

Reflect.construct()

Baseline Weitgehend verfgbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Gerten und in vielen Browserversionen. Sie ist seit September 2016 browserbergreifend verfgbar.

Die Reflect.construct() statische Methode funktioniert hnlich wie der new Operator, jedoch als Funktion. Sie ist gleichbedeutend mit dem Aufruf von new target(...args). Zustzlich erlaubt sie es, einen anderen new.target Wert anzugeben.

In diesem Artikel

Probieren Sie es aus

function func1(a, b, c) {
  this.sum = a + b + c;
}

const args = [1, 2, 3];
const object1 = new func1(...args);
const object2 = Reflect.construct(func1, args);

console.log(object2.sum);
// Expected output: 6

console.log(object1.sum);
// Expected output: 6

Syntax

js
Reflect.construct(target, argumentsList)
Reflect.construct(target, argumentsList, newTarget)

Parameter

target

Die Ziel-Funktion, die aufgerufen werden soll.

argumentsList

Ein array-hnliches Objekt, das die Argumente enthlt, mit denen target aufgerufen werden soll.

newTarget Optional

Der Wert des new.target Ausdrucks innerhalb von target. Standardmig target. Im Allgemeinen (siehe Beispiel), spezifiziert target die Logik zur Initialisierung des Objekts, whrend newTarget.prototype das Prototype des konstruierten Objekts angibt.

Rckgabewert

Eine neue Instanz von target (oder newTarget, falls angegeben), initialisiert durch target als Konstruktor mit der gegebenen argumentsList.

Ausnahmen

TypeError

Wird ausgelst, wenn target oder newTarget kein Konstruktor ist oder wenn argumentsList kein Objekt ist.

Beschreibung

Reflect.construct() bietet die reflektive Semantik eines Konstruktoraufrufs. Das heit, Reflect.construct(target, argumentsList, newTarget) ist semantisch gleichwertig mit:

js
new target(...argumentsList);

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, whrend target der eigentliche Konstruktor ist, der zur Initialisierung des Objekts ausgefhrt wird. Zum Beispiel kann new.target auch von dem aktuell ausgefhrten Konstruktor in der Klassenvererbung abweichen.

js
class A {
  constructor() {
    console.log(new.target.name);
  }
}
class B extends A {}

new B(); // "B"

Reflect.construct() ermglicht es Ihnen, einen Konstruktor mit einer variablen Anzahl von Argumenten aufzurufen. (Dies ist auch mit der Spread-Syntax in einem normalen Konstruktoraufruf mglich.)

js
const obj = new Foo(...args);
const obj = Reflect.construct(Foo, args);

Reflect.construct() ruft die [[Construct]] objektinterne Methode von target auf.

Beispiele

Verwendung von Reflect.construct()

js
const d = Reflect.construct(Date, [1776, 6, 4]);
d instanceof Date; // true
d.getFullYear(); // 1776

ndern von new.target

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.

js
function OneClass() {
  console.log("OneClass executed");
  console.log(`new.target is ${new.target.name}`);
}

function OtherClass() {
  console.log("OtherClass executed");
  console.log(`new.target is ${new.target.name}`);
}

const obj1 = Reflect.construct(OneClass, []);
// Logs:
// OneClass executed
// new.target is OneClass
console.log(obj1 instanceof OneClass); // true

const obj2 = Reflect.construct(OneClass, [], OtherClass);
// Logs:
// OneClass executed
// new.target is OtherClass
console.log(obj2 instanceof OtherClass); // true
console.log(obj2 instanceof OneClass); // false

Natrlich gibt es keine starke Garantie ber die Prototypenkette des konstruierten Objekts, da dies von der Implementierung des Konstruktors abhngt. Zum Beispiel, wenn der target Konstruktor ein Objekt zurckgibt, dann wird dieses Objekt zum konstruierten Objekt, unabhngig vom newTarget Wert. Wenn target ein Proxy mit einer construct-Falle ist, dann kontrolliert die Falle vollstndig den Konstruktionsvorgang.

js
function OneClass() {
  return { name: "one" };
}

function OtherClass() {
  return { name: "other" };
}

const obj1 = Reflect.construct(OneClass, [], OtherClass);
console.log(obj1.name); // 'one'
console.log(obj1 instanceof OneClass); // false
console.log(obj1 instanceof OtherClass); // false

Ein gltiges 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.

js
function OneClass() {
  console.log("OneClass executed");
  console.log(`new.target is ${new.target.name}`);
}

function OtherClass() {
  console.log("OtherClass executed");
  console.log(`new.target is ${new.target.name}`);
}

OtherClass.prototype = null;

const obj = Reflect.construct(OneClass, [], OtherClass);
// Logs:
// OneClass executed
// new.target is OtherClass
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true

Reflect.construct() vs. Object.create()

Vor der Einfhrung von Reflect konnten Objekte mit einer beliebigen Kombination von Konstruktoren und Prototypen unter Verwendung von Object.create() konstruiert werden.

js
function OneClass() {
  this.name = "one";
}

function OtherClass() {
  this.name = "other";
}

const args = [];
const obj1 = Reflect.construct(OneClass, args, OtherClass);
const obj2 = Object.create(OtherClass.prototype);
OneClass.apply(obj2, args);

console.log(obj1.name); // 'one'
console.log(obj2.name); // 'one'

console.log(obj1 instanceof OneClass); // false
console.log(obj2 instanceof OneClass); // false

console.log(obj1 instanceof OtherClass); // true
console.log(obj2 instanceof OtherClass); // true

Whrend 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 fr den Konstruktor verwendeten Funktion auf undefined, da das new Schlsselwort nicht zum Erstellen des Objekts verwendet wird. (Tatschlich 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.

js
function OneClass() {
  console.log("OneClass");
  console.log(new.target);
}
function OtherClass() {
  console.log("OtherClass");
  console.log(new.target);
}

const obj1 = Reflect.construct(OneClass, args);
// Logs:
// OneClass
// function OneClass { ... }

const obj2 = Reflect.construct(OneClass, args, OtherClass);
// Logs:
// OneClass
// function OtherClass { ... }

const obj3 = Object.create(OtherClass.prototype);
OneClass.apply(obj3, args);
// Output:
//     OneClass
//     undefined

Spezifikationen

Spezifikation
ECMAScript 2027 LanguageSpecification
# sec-reflect.construct

Browser-Kompatibilitt

Siehe auch


Web Proxy Viewer  |  New URL  |  Original Page