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

Object.getOwnPropertySymbols()

Methode

Gibt ein Array aller eigenen Symbol-Schlüssel eines Objekts zurück – auch nicht aufzählbarer, aber ohne geerbte Eigenschaften.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Object.getOwnPropertySymbols(obj)

Beschreibung

Object.getOwnPropertySymbols() ist das Gegenstück zu Object.getOwnPropertyNames(): Während dieses nur String-Schlüssel liefert, gibt getOwnPropertySymbols() ausschließlich die Symbol-Schlüssel zurück, die direkt auf dem Objekt definiert sind. Nicht aufzählbare Symbol-Eigenschaften sind dabei eingeschlossen, geerbte über die Prototypkette nicht.

Die Methode ist wichtig, weil Symbol-Eigenschaften von for...in, Object.keys(), Object.entries() und JSON.stringify() ignoriert werden. Wer Objekte vollständig kopieren, untersuchen oder serialisieren will (z. B. in Bibliotheken für tiefes Klonen, Debugging-Tools oder Test-Frameworks), braucht diese Methode oder Reflect.ownKeys().

Symbole bieten „weiche“ Privatsphäre: Sie verhindern Namenskollisionen, sind aber nicht wirklich privat – über getOwnPropertySymbols() kann jeder Code sie auslesen. Für echte Kapselung eignen sich private Klassenfelder (#feld) oder WeakMap.

Parameter

Name Typ Default Beschreibung
$obj Pflicht Object Das Objekt, dessen eigene Symbol-Eigenschaften ermittelt werden sollen. Primitive Werte werden in ein Objekt umgewandelt; null und undefined lösen einen TypeError aus.

Rückgabewert

Typ
Array<symbol>
Beschreibung
Ein neues Array mit allen eigenen Symbol-Schlüsseln des Objekts in Einfügereihenfolge. Hat das Objekt keine, wird ein leeres Array zurückgegeben.

Beispiele

Symbol-Schlüssel eines Objekts auslesen

const id = Symbol('id');
const meta = Symbol('meta');

const user = {
  name: 'Anna',
  [id]: 42,
  [meta]: { erstellt: '2024-01-01' }
};

console.log(Object.keys(user));
console.log(Object.getOwnPropertySymbols(user));
console.log(user[Object.getOwnPropertySymbols(user)[0]]);
['name'] [Symbol(id), Symbol(meta)] 42

Auch nicht aufzählbare Symbole werden gefunden

const geheim = Symbol('geheim');
const obj = {};

Object.defineProperty(obj, geheim, {
  value: 'versteckt',
  enumerable: false
});

console.log(Object.getOwnPropertySymbols(obj));
console.log(obj.propertyIsEnumerable(geheim));
[Symbol(geheim)] false

Flache Kopie inklusive Symbol-Eigenschaften

const vollstaendigeKopie = (quelle) => {
  const ziel = Object.create(Object.getPrototypeOf(quelle));
  const schluessel = [
    ...Object.getOwnPropertyNames(quelle),
    ...Object.getOwnPropertySymbols(quelle)
  ];
  for (const key of schluessel) {
    Object.defineProperty(ziel, key, Object.getOwnPropertyDescriptor(quelle, key));
  }
  return ziel;
};

const tag = Symbol('tag');
const original = { wert: 1, [tag]: 'wichtig' };
const kopie = vollstaendigeKopie(original);

console.log(kopie[tag]);
console.log(JSON.stringify(kopie));
wichtig {"wert":1}

// Wichtig · Fallstricke

  • Nur eigene Symbole: Geerbte Symbole (z. B. Symbol.iterator auf Array.prototype) tauchen nicht auf. Object.getOwnPropertySymbols([]) liefert daher [].
  • Keine echte Privatsphäre: Symbol-Schlüssel sind für jeden Code einsehbar. Für echte Kapselung private Klassenfelder (#name) oder WeakMap verwenden.
  • Alle Schlüssel auf einmal: Reflect.ownKeys(obj) liefert Strings und Symbole zusammen und ist meist die kürzere Wahl.
  • Aufzählbarkeit prüfen: Die Methode filtert nicht nach enumerable. Wer nur aufzählbare Symbole will, filtert mit obj.propertyIsEnumerable(sym) (so verhält sich auch Object.assign() und der Spread-Operator, die aufzählbare Symbole mitkopieren).
  • Fehler: Bei null oder undefined wird ein TypeError ausgelöst. Primitive Werte werden seit ES2015 automatisch in Objekte umgewandelt.
  • Proxies: Bei einem Proxy wird die Falle ownKeys ausgelöst.
  • Unterstützt in allen modernen Browsern und Node.js; nicht im Internet Explorer.