Как описано по http://www.json.org/js.html, объекты JavaScript могут продиктовать, как они сериализируются JSON.stringify () путем реализации toJSON () метод. Для произвольного объекта не определяется этот метод, в то время как числа и строки, кажется, реализуют метод. Мне любопытно - почему объекты не имеют реализации?
Править: Я первоначально упомянул, что массивы имеют этот метод - они не делают. Я приношу извинения за беспорядок.
Те методы, о которых вы упоминаете, были добавлены некоторыми JavaScript-движками (AFAIK последние версии V8 и Tracemonkey реализуют их):
String.prototype.toJSON
Boolean.prototype.toJSON
Number.prototype.toJSON
Date.prototype.toJSON
Хотя единственной стандартизованной спецификацией ECMAScript 5 является Date.prototype.toJSON
.
Лично я считаю, что эти методы вообще не очень полезны, результаты от String
, Boolean
, и Number
полностью эквивалентны вызову метода valueOf
, а результат от Date эквивалентен вызову toISOString
.
Итак, вопрос был поставлен: Почему нативные объекты не имеют метода toJSON()?
Ну, с имеющимся объектом JSON
(раздел 15.12), добавление другого метода в Object.prototype
не стоит, и на самом деле я думаю, что было бы плохой идеей добавить его...
Не думаю, что в случае с Numbers и т.д. реализация по умолчанию имеет реализацию toJSON. Может быть, вы используете Prototype или другой фреймворк?
http://www.w3schools.com/jsref/jsref_obj_number.asp
http://www.w3schools.com/jsref/jsref_obj_array.asp
С http://www.prototypejs.org/learn/json :
Кодирование
Кодирование JSON прототипа слегка отличается от Крокфорда внедрение, поскольку оно не распространяется Объект.прототип. Следующий методы доступны: Номер#toJSON, String#toJSON, Array#toJSON, Hash#toJSON, Date#toJSON и Object.toJSON.
Сомневаюсь, что это причина - массивы, похоже, тоже их не имеют. Вот как я бы это реализовал:
Array.prototype.toJSON = Object.prototype.toJSON = function() {
return JSON.stringify(this);
}
Стандартно не реализовывать функции на произвольных объектах.
попробуйте console.log({})
и вы ничего не увидите.