Signatur
Beschreibung
Object.getOwnPropertyNames() liefert die Namen aller Eigenschaften, die direkt auf einem Objekt definiert sind. Anders als Object.keys() sind darin auch nicht-auflistbare Eigenschaften enthalten (enumerable: false), etwa length bei Arrays oder Eigenschaften, die mit Object.defineProperty() ohne enumerable angelegt wurden.
Eigenschaften aus der Prototyp-Kette werden nicht berücksichtigt, ebenso wenig Schlüssel vom Typ Symbol. Für Symbole gibt es Object.getOwnPropertySymbols(); wer wirklich alle eigenen Schlüssel braucht, verwendet Reflect.ownKeys().
Die Reihenfolge folgt den Regeln für eigene Schlüssel: zuerst ganzzahlige Indizes in aufsteigender Reihenfolge, danach die übrigen String-Schlüssel in der Reihenfolge, in der sie angelegt wurden. Typische Anwendungsfälle sind Introspektion, Debugging, das Auflisten der Methoden einer Klasse (über ihren prototype) und das vollständige Kopieren von Objekten inklusive Property-Deskriptoren.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $obj Pflicht | object | Das Objekt, dessen eigene String-Schlüssel ermittelt werden. Primitive Werte werden seit ES2015 in ein Objekt umgewandelt; null und undefined lösen einen TypeError aus. |
Rückgabewert
obj.Beispiele
Unterschied zu Object.keys()
const arr = ['a', 'b', 'c'];
console.log(Object.keys(arr));
console.log(Object.getOwnPropertyNames(arr));
const config = { host: 'localhost' };
Object.defineProperty(config, 'secret', { value: 'geheim', enumerable: false });
console.log(Object.keys(config));
console.log(Object.getOwnPropertyNames(config));
Methoden einer Klasse auflisten
class UserService {
constructor() { this.cache = new Map(); }
load() {}
save() {}
static create() { return new UserService(); }
}
const methods = Object.getOwnPropertyNames(UserService.prototype)
.filter((name) => name !== 'constructor');
console.log(methods);
// Instanz-Eigenschaften liegen direkt auf dem Objekt
console.log(Object.getOwnPropertyNames(new UserService()));
Nur nicht-auflistbare Eigenschaften finden
const getHiddenProps = (obj) =>
Object.getOwnPropertyNames(obj).filter(
(key) => !Object.prototype.propertyIsEnumerable.call(obj, key)
);
console.log(getHiddenProps([1, 2]));
console.log(getHiddenProps(Math).slice(0, 4));
Symbole werden ignoriert
const id = Symbol('id');
const obj = { name: 'Ada', [id]: 42 };
console.log(Object.getOwnPropertyNames(obj));
console.log(Object.getOwnPropertySymbols(obj));
console.log(Reflect.ownKeys(obj));
// Wichtig · Fallstricke
- Keine geerbten Eigenschaften: Wer auch die Prototyp-Kette braucht, muss sie selbst mit
Object.getPrototypeOf()durchlaufen. - Keine Symbole: Symbol-Schlüssel fehlen immer. Für alle Schlüssel
Reflect.ownKeys()verwenden. - Primitive: In ES5 wirft
Object.getOwnPropertyNames('abc')einenTypeError, seit ES2015 ergibt es['0', '1', '2', 'length'].nullundundefinedwerfen weiterhin einenTypeError. - Proxies: Bei einem
Proxywird dieownKeys-Falle ausgelöst; das Ergebnis kann daher vom tatsächlichen Ziel abweichen. - Klassenfelder und Methoden: Methoden einer Klasse liegen auf
Klasse.prototypeund sind nicht auflistbar, Klassenfelder dagegen direkt auf der Instanz. Private Felder (#feld) erscheinen nie. - In allen modernen Browsern und in Node.js verfügbar.