Signatur
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
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'));
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));
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);
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);
// Wichtig · Fallstricke
- receiver im Proxy nicht vergessen: Schreibt man im
get-Trap nurtarget[prop]oderReflect.get(target, prop), dann laufen Getter mitthis === target. Weitere Zugriffe innerhalb des Getters umgehen so den Proxy. Deshalb immerreceivermitgeben. - Kein Objekt, kein Zugriff: Ist
targetein primitiver Wert (string,number,null,undefined…), gibt es einenTypeError. Beim Punkt-Operator wird der Wert dagegen automatisch in ein Objekt umgewandelt. receiverhat 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.