2016-07-23 6 views
9

Das folgende Beispiel zeigt, dass JSON.stringify() die Zeichenfolge "{}" für SpeechSynthesisVoice Objekte zurückgibt:Warum gibt JSON.stringify die leere Objektnotation "{}" für ein Objekt zurück, das Eigenschaften zu haben scheint?

var voiceObject = window.speechSynthesis.getVoices()[0]; 
JSON.stringify(voiceObject); //returns "{}"? 

Komplettes Beispiel: JSFiddle

Warum es "{}" und nicht so etwas wie "{voiceURI: "Google Deutsch", name: "Google Deutsch", lang: "de-DE", localService: false, default: false}" zurückkehrt?

Beachten Sie, dass das obige Beispiel nicht für Chrome oder iOS funktioniert; Es ist für Mozilla Firefox ausgerichtet.

Antwort

10

JSON.stringify enthält ein eigene, zählbare Eigenschaften des Objekts (spec), die Werte haben, die nicht funktionieren oder undefined (wie JSON nicht über diese), die sie von ihrem Prototyp erben Weglassen, alle, die definiert werden als nicht aufzählbar und jede, deren Wert eine Funktionsreferenz oder undefined ist.

Also klar, das Objekt, das Sie von getVoices()[0] zurückbekommen, hat keine eigenen, aufzählbaren Eigenschaften, die in JSON dargestellt werden können. Alle ihre Eigenschaften müssen entweder vererbt sein, als nicht aufzählbar definiert sein oder (obwohl dies wahrscheinlich nicht der Fall ist) Funktionen oder undefined.

+3

Oder Eigenschaften, die keine gültigen JSON-Datentypen sind, obwohl das für das Beispiel der Frage wahrscheinlich nicht relevant ist. –

+0

Ok, danke! Ich habe das Beispiel aktualisiert, um zu zeigen, dass das Sprachobjekt einige Eigenschaften wie ein normales Objekt zu haben scheint. Wie können Sie (mithilfe der Debug-Ansicht oder der Konsolenausgabe) sehen, dass diese Eigenschaften vererbt werden? –

+0

@MathiasS: Wenn '.hasOwnProperty()' false zurückgibt – slebetman