Start · Sprachen · JavaScript · Referenz · Reflect.get()

Reflect.get()

Methode

Liest eine Eigenschaft eines Objekts wie <code>target[propertyKey]</code>, aber als Funktion und mit optionalem <code>receiver</code> als <code>this</code> für Getter.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Reflect.get(target, propertyKey[, receiver])

Beschreibung

Reflect.get() ist die funktionale Form des Eigenschaftszugriffs target[propertyKey]. Die Eigenschaft wird wie gewohnt gesucht, also auch entlang der Prototypenkette. Existiert sie nicht, liefert die Methode undefined.

Der Hauptnutzen liegt in Proxy-Handlern: Im get-Trap gibt man mit Reflect.get(target, prop, receiver) den Zugriff unverändert an das Standardverhalten weiter. Der dritte Parameter receiver ist dabei wichtig. Er bestimmt, welches Objekt in einem Getter als this gilt. Ohne ihn würden Getter auf dem Originalobjekt statt auf dem Proxy (oder einem erbenden Objekt) laufen.

Anders als der Punkt- oder Klammer-Operator wirft Reflect.get() einen TypeError, wenn target kein Objekt ist. Primitive Werte wie Strings oder Zahlen werden also nicht automatisch in Objekte umgewandelt.

Parameter

Name Typ Default Beschreibung
$target Pflicht Object Das Objekt, dessen Eigenschaft gelesen wird. Muss ein Objekt sein (auch Funktion oder Array), sonst gibt es einen TypeError.
$propertyKey Pflicht string|symbol Name oder Symbol der Eigenschaft. Andere Werte werden in einen Eigenschaftsschlüssel umgewandelt (z. B. 0 → "0").
$receiver any target Der Wert, der als this gilt, wenn die Eigenschaft ein Getter ist. Im Proxy-get-Trap übergibt man hier den dritten Trap-Parameter.

Rückgabewert

Typ
any
Beschreibung
Der Wert der Eigenschaft oder undefined, wenn es sie weder am Objekt noch in seiner Prototypenkette gibt.

Beispiele

Grundlegender Zugriff auf Objekte und Arrays

const user = { name: 'Anna', age: 31 };
const colors = ['rot', 'grün', 'blau'];

console.log(Reflect.get(user, 'name'));
console.log(Reflect.get(colors, 1));
console.log(Reflect.get(user, 'email'));
Anna grün undefined

Getter mit eigenem receiver aufrufen

const person = {
  firstName: 'Max',
  lastName: 'Muster',
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
};

const otherContext = { firstName: 'Erika', lastName: 'Beispiel' };

console.log(Reflect.get(person, 'fullName'));
console.log(Reflect.get(person, 'fullName', otherContext));
Max Muster Erika Beispiel

Proxy: Zugriffe protokollieren und Standardwerte liefern

const config = { host: 'localhost', port: 8080 };

const loggedConfig = new Proxy(config, {
  get(target, prop, receiver) {
    console.log(`Zugriff auf: ${String(prop)}`);
    // Standardverhalten korrekt weitergeben, receiver = Proxy
    return Reflect.has(target, prop)
      ? Reflect.get(target, prop, receiver)
      : `kein Wert für "${String(prop)}"`;
  }
});

console.log(loggedConfig.port);
console.log(loggedConfig.timeout);
Zugriff auf: port 8080 Zugriff auf: timeout kein Wert für "timeout"

TypeError bei primitiven Werten

try {
  Reflect.get('Hallo', 'length');
} catch (err) {
  console.log(err instanceof TypeError);
}

// Der normale Zugriff funktioniert, weil der String in ein Objekt umgewandelt wird
console.log('Hallo'.length);
true 5

// Wichtig · Fallstricke

  • receiver im Proxy nicht vergessen: Schreibt man im get-Trap nur target[prop] oder Reflect.get(target, prop), dann laufen Getter mit this === target. Weitere Zugriffe innerhalb des Getters umgehen so den Proxy. Deshalb immer receiver mitgeben.
  • Kein Objekt, kein Zugriff: Ist target ein primitiver Wert (string, number, null, undefined …), gibt es einen TypeError. Beim Punkt-Operator wird der Wert dagegen automatisch in ein Objekt umgewandelt.
  • receiver hat nur bei Gettern eine Wirkung. Bei normalen Dateneigenschaften wird er ignoriert.
  • Der Zugriff löst Getter und Proxy-Traps aus. Er ist also nicht frei von Nebenwirkungen. Wer eine Eigenschaft nur untersuchen will, ohne einen Getter auszuführen, nimmt Reflect.getOwnPropertyDescriptor().
  • Kompatibilität: Alle modernen Browser und Node.js ab Version 6 unterstützen die Methode. Internet Explorer unterstützt sie nicht.