Signatur
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
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]]);
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));
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 · Fallstricke
- Nur eigene Symbole: Geerbte Symbole (z. B.
Symbol.iteratoraufArray.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) oderWeakMapverwenden. - 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 mitobj.propertyIsEnumerable(sym)(so verhält sich auchObject.assign()und der Spread-Operator, die aufzählbare Symbole mitkopieren). - Fehler: Bei
nulloderundefinedwird einTypeErrorausgelöst. Primitive Werte werden seit ES2015 automatisch in Objekte umgewandelt. - Proxies: Bei einem
Proxywird die FalleownKeysausgelöst. - Unterstützt in allen modernen Browsern und Node.js; nicht im Internet Explorer.