Start · Sprachen · JavaScript · Referenz · Object.getOwnPropertyNames()

Object.getOwnPropertyNames()

Methode

Gibt ein Array mit allen eigenen String-Schlüsseln eines Objekts zurück – auch nicht-auflistbare, aber ohne Symbol-Schlüssel.

seit JavaScript ES5 (ES2015: Primitive werden in Objekte umgewande Kategorie: method-property

Signatur

Object.getOwnPropertyNames(obj)

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

Typ
string[]
Beschreibung
Ein neues Array mit den Namen aller eigenen String-Eigenschaften (auflistbar und nicht auflistbar) von 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));
[ '0', '1', '2' ] [ '0', '1', '2', 'length' ] [ 'host' ] [ 'host', 'secret' ]

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()));
[ 'load', 'save' ] [ 'cache' ]

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));
[ 'length' ] [ 'abs', 'acos', 'acosh', 'asin' ]

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));
[ 'name' ] [ Symbol(id) ] [ 'name', Symbol(id) ]

// 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') einen TypeError, seit ES2015 ergibt es ['0', '1', '2', 'length']. null und undefined werfen weiterhin einen TypeError.
  • Proxies: Bei einem Proxy wird die ownKeys-Falle ausgelöst; das Ergebnis kann daher vom tatsächlichen Ziel abweichen.
  • Klassenfelder und Methoden: Methoden einer Klasse liegen auf Klasse.prototype und sind nicht auflistbar, Klassenfelder dagegen direkt auf der Instanz. Private Felder (#feld) erscheinen nie.
  • In allen modernen Browsern und in Node.js verfügbar.