Пользовательский JSON.stringify для классов с методом toJSON

Метод toJSON позволяет указать JSON.stringify, как распечатать Class. Это может быть очень полезно...

Зачем Stringify объекты?

Ответ на это как обычно — причин много. Самый очевидный из них — отправить объект удаленному сервису в качестве полезной нагрузки на запрос. Другими причинами могут быть:

  • Создать хэш из JSON (этому трюку я научился еще в Cesium),
  • глубокое клонирование объекта (const dupe = JSON.parse(JSON.stringify(duped));) - не рекомендуется в производстве, но возможно...
  • Ведение журнала

Наверняка есть еще причины, но не в этом дело. Дело в том, что бывают случаи, когда вы хотели бы преобразовать свои объекты в строки.

Ваш класс как JSON

Давайте создадим простой класс и запишем его экземпляр в строку:

MyClass будет иметь закрытое свойство #somethingCool, которое недоступно за пределами самого класса. У него есть сеттер и геттер для взаимодействия с ним. Попытка преобразовать экземпляр нашего класса в строку приводит к пустому объекту:

Это то, как мы ожидаем, что наш JSON будет выглядеть? Я думаю, что в большинстве случаев мы бы не стали… Представьте, что в ваших журналах отсутствует важное свойство, созданное на основе файла getter. Облом...

Определение того, как ваш класс преобразуется в строку с использованием toJSON

Добавив в свой класс метод toJSON, JSON.stringify будет знать, как распечатать экземпляр вашего класса:

Разница между последним классом выше и классом в предыдущей части статьи заключается в методе toJSON. В этом случае он возвращает объект со свойством somethingCool со значением somethingCool, возвращаемым из нашего getter.

Использование JSON.stringify приводит к ожидаемому результату:

Краткое содержание

JSON.stringify — очень полезный инструмент. При использовании сложных классов/объектов с сеттерами, геттерами и возможными декораторами в результате стробирования могут отсутствовать некоторые свойства, которые мы ожидали бы там иметь.

Использование toJSON позволяет нам определить, какие свойства выводить как часть вывода JSON экземпляров класса.

Обратите внимание, что мы могли бы добиться того же эффекта с помощью функции JSON.stringify replacer (JSON.stringify(object, toJSONFunction).

Большое спасибо Ювалю Бар Леви и Пётру из xFAANG за добрый и подробный отзыв!