Signatur
Beschreibung
Reflect.ownKeys() liefert alle eigenen Schlüssel eines Objekts. Dazu gehören String-Schlüssel und Symbol-Schlüssel, aufzählbare und nicht aufzählbare. Das Ergebnis entspricht Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)). Geerbte Eigenschaften aus der Prototypkette sind nicht enthalten.
Die Reihenfolge ist festgelegt: Zuerst kommen ganzzahlige Index-Schlüssel in aufsteigender Reihenfolge. Danach folgen die übrigen String-Schlüssel in der Reihenfolge, in der sie angelegt wurden. Zum Schluss kommen die Symbole, ebenfalls in Anlagereihenfolge.
Typische Einsatzfälle:
- vollständiges Kopieren oder Klonen von Objekten samt Symbolen und nicht aufzählbaren Eigenschaften, etwa zusammen mit
Object.getOwnPropertyDescriptor() - Untersuchen von Objekten beim Debuggen oder Serialisieren
- Weiterreichen an den Ziel-Handler im
ownKeys-Trap einesProxy
Ist target kein Objekt, wirft die Methode einen TypeError. Object.keys() verhält sich anders: Es wandelt Primitive in Objekte um.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $target Pflicht | object | Das Objekt, dessen eigene Schlüssel ermittelt werden sollen. Primitive Werte führen zu einem TypeError. |
Rückgabewert
target, in der oben beschriebenen Reihenfolge.Beispiele
Alle Schlüssel inklusive Symbol und nicht aufzählbarer Eigenschaft
const id = Symbol('id');
const user = { name: 'Anna', 2: 'b', 1: 'a', [id]: 42 };
Object.defineProperty(user, 'secret', { value: 'x', enumerable: false });
console.log(Object.keys(user));
console.log(Reflect.ownKeys(user));
Vollständige flache Kopie mit Property-Deskriptoren
const cloneExact = (obj) => {
const copy = Object.create(Object.getPrototypeOf(obj));
for (const key of Reflect.ownKeys(obj)) {
Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key));
}
return copy;
};
const tag = Symbol('tag');
const original = { get full() { return 'Getter bleibt erhalten'; }, [tag]: 'intern' };
const kopie = cloneExact(original);
console.log(kopie.full, kopie[tag]);
Private Felder im Proxy per ownKeys-Trap ausblenden
const data = { _token: 'abc', user: 'max', role: 'admin' };
const safe = new Proxy(data, {
ownKeys: (target) =>
Reflect.ownKeys(target).filter((k) => typeof k !== 'string' || !k.startsWith('_'))
});
console.log(Reflect.ownKeys(safe));
console.log(Object.keys(safe));
Arrays und Fehler bei Primitiven
console.log(Reflect.ownKeys(['a', 'b']));
try {
Reflect.ownKeys('text');
} catch (err) {
console.log(err.constructor.name);
}
// Wichtig · Fallstricke
- TypeError bei Primitiven:
Reflect.ownKeys(42)oderReflect.ownKeys(null)wirft einen Fehler.Object.getOwnPropertyNames('abc')dagegen funktioniert, weil es Primitive vorher in Objekte umwandelt. - Keine geerbten Schlüssel: Eigenschaften aus der Prototypkette tauchen nicht auf, zum Beispiel Methoden einer Klasse bei deren Instanzen. Für diese Fälle muss man mit
Object.getPrototypeOf()die Kette selbst durchlaufen. - Nicht aufzählbare Schlüssel: Auch Einträge wie
lengthbei Arrays werden zurückgegeben. Wer nur aufzählbare Schlüssel braucht, filtert mitObject.prototype.propertyIsEnumerableoder nutztObject.keys(). - Invarianten im Proxy: Ein
ownKeys-Trap darf nicht konfigurierbare Schlüssel des Ziels nicht weglassen. Bei nicht erweiterbaren Zielen darf er keine zusätzlichen Schlüssel erfinden. Sonst wirft die Engine einenTypeError. Außerdem sind nur Strings und Symbole als Rückgabe erlaubt. - Kompatibilität: Unterstützt in allen modernen Browsern und in Node.js ab Version 6. Im Internet Explorer fehlt die Methode.