2016-07-23 7 views
9

Следующий пример показывает, что JSON.stringify() возвращает строку "{}" для объектов SpeechSynthesisVoice:Почему JSON.stringify возвращает пустое обозначение объекта "{}" для объекта, который, как представляется, имеет свойства?

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

Полный пример: JSFiddle

Почему это возвращение "{}", а не что-то вроде "{voiceURI: "Google Deutsch", name: "Google Deutsch", lang: "de-DE", localService: false, default: false}"?

Обратите внимание, что приведенный выше пример не работает для хрома или iOS; он предназначен для Mozilla Firefox.

ответ

10

JSON.stringify включает собственного, перечисляемые свойства объекта (spec), которые имеют значение, которые не являются функциями или undefined (в формате JSON не имеет тех), в результате чего из них он наследует от своего прототипа, любой, которые определены как неперечислимый, и любой, значение которого является ссылкой на функцию или undefined.

Понятно, что объект, который вы возвращаете с getVoices()[0], не имеет собственных перечислимых свойств, которые могут быть представлены в JSON. Все их свойства должны быть либо наследуемыми, либо неперечислимыми, либо (хотя это, вероятно, не так) функциями, либо undefined.

+3

Или свойства, недопустимые типы данных JSON, хотя это, вероятно, не относится к примеру вопроса. –

+0

Хорошо, спасибо! Я обновил этот пример, чтобы показать, что у голосового объекта есть некоторые свойства, такие как обычный объект. Как вы можете видеть (используя представление отладки или выход из консоли), что эти свойства наследуются? –

+0

@MathiasS: Когда '.hasOwnProperty()' возвращает false – slebetman