2016-07-23 22 views
9

Poniższy przykład pokazuje, że JSON.stringify() zwraca łańcuch "{}" obiektów SpeechSynthesisVoice:Dlaczego JSON.stringify zwraca notację pustego obiektu "{}" dla obiektu, który wydaje się mieć właściwości?

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

Kompletna przykład: JSFiddle

Dlaczego powrotu "{}" a nie coś podobnego "{voiceURI: "Google Deutsch", name: "Google Deutsch", lang: "de-DE", localService: false, default: false}"?

Należy zauważyć, że powyższy przykład nie działa w przypadku Chrome lub iOS; jest przeznaczony dla przeglądarki Mozilla Firefox.

Odpowiedz

10

JSON.stringify zawiera obiekt za własne, przeliczalny właściwości (spec), które mają wartości, które nie są funkcjami lub undefined (jako JSON nie posiada tych), pomijając te, które dziedziczy od swojego pierwowzoru, każdy, które są zdefiniowane jako nieprzeliczalny i dowolny, którego wartością jest odwołanie do funkcji lub undefined.

Tak więc obiekt, który otrzymasz od getVoices()[0], nie ma własnych, przeliczalnych właściwości, które mogą być reprezentowane w JSON. Wszystkie ich właściwości muszą być dziedziczone, zdefiniowane jako nieprzeliczalne lub (choć prawdopodobnie nie w tym przypadku) funkcje lub undefined.

+3

Lub właściwości, które nie są poprawnymi typami danych JSON, chociaż prawdopodobnie nie jest to związane z przykładem pytania. –

+0

OK, dzięki! Zaktualizowałem przykład, aby pokazać, że obiekt głosowy ma pewne właściwości, takie jak normalny obiekt. Jak widzisz (korzystając z widoku debugowania lub z wyjścia konsoli), że te właściwości są dziedziczone? –

+0

@MathiasS: Kiedy '.hasOwnProperty()' zwraca fałsz – slebetman