Почему объекты JavaScript не имеют toJSON () методом?

Как описано по http://www.json.org/js.html, объекты JavaScript могут продиктовать, как они сериализируются JSON.stringify () путем реализации toJSON () метод. Для произвольного объекта не определяется этот метод, в то время как числа и строки, кажется, реализуют метод. Мне любопытно - почему объекты не имеют реализации?

Править: Я первоначально упомянул, что массивы имеют этот метод - они не делают. Я приношу извинения за беспорядок.

8
задан Jeff Hammerbacher 4 January 2010 в 14:42
поделиться

4 ответа

Те методы, о которых вы упоминаете, были добавлены некоторыми 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 не стоит, и на самом деле я думаю, что было бы плохой идеей добавить его...

.
6
ответ дан 5 December 2019 в 14:03
поделиться

Не думаю, что в случае с 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.

3
ответ дан 5 December 2019 в 14:03
поделиться

Сомневаюсь, что это причина - массивы, похоже, тоже их не имеют. Вот как я бы это реализовал:

Array.prototype.toJSON = Object.prototype.toJSON = function() {
  return JSON.stringify(this);
}
-3
ответ дан 5 December 2019 в 14:03
поделиться

Стандартно не реализовывать функции на произвольных объектах.

попробуйте console.log({}) и вы ничего не увидите.

.
0
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: