2016-05-18 6 views
2

Ich möchte JSON.stringify alle Eigenschaften eines Objekts, einschließlich derjenigen über Getter definiert. Allerdings, wenn ich JSON.stringify auf ein Objekt aufrufen, Eigenschaften über Getter definiert sind weggelassen:Siehe alle Schlüssel eines JS-Objekts, auch die von Getter

> const obj = {key: 'val'} 
undefined 

> JSON.stringify(obj) 
'{"key":"val"}' 

> Object.defineProperty(obj, 'getter', {get:() => 'from getter'}) 
{ key: 'val' } 

> obj.getter 
'from getter' 

> JSON.stringify(obj) 
'{"key":"val"}' 

Ich hatte gehofft, um zu sehen:

> JSON.stringify(obj) 
'{"key":"val", "getter": "from getter"}' 

Ist das möglich? Object.keys erkennt nicht die Getter entweder:

> Object.keys(obj) 
[ 'key' ] 

Können Sie für Getter Schlüssel abfragen? Oder müssen Sie ihre Namen im Voraus wissen?

+2

Die Tatsache, dass es ein Getter ist, ist irrelevant; Das Problem ist, dass es nicht aufzählbar ist. ('Object.defineProperty' verwendet einen Standard' enumerable: false'.) Sie möchten nicht aufzählbare Eigenschaften aufzählen (was möglich ist, aber das ist die Beschreibung Ihres Problems). – apsillers

+1

vielleicht die Eigenschaft aufzählbar machen? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Enumerable_attribute – ray

+1

@apsillers: Machen Sie eine Antwort :) –

Antwort

3

JSON.stringify only includes enumerable properties in seiner Ausgabe.

Wenn enumerable nicht für den in übergebenen Eigenschaftsdeskriptor angegeben ist, wird standardmäßig enumerable: false verwendet. Daher ist jede Eigenschaftendefinition, die von Object.defineProperty (mit einem Getter oder nicht) ausgeführt wird, nicht aufzählbar, es sei denn, Sie geben explizit enumerable: true an.

Sie können alle Eigenschaften, die für ein Objekt existieren (N.B: nicht geerbte Eigenschaften) mit Object.getOwnPropertyNames oder (in ES2015 +) Relect.ownKeys. (Der einzige Unterschied zwischen diesen ist, dass Reflect.ownKeys also includes properties defined by a Symbol key.) Es ist nicht möglich, JSON.stringify nicht aufzählbare Eigenschaften zu machen; Sie müssen stattdessen die Eigenschaft aufzählbar machen.

+0

Danke! Das macht Sinn. –

Verwandte Themen