#javascript #json #class
#javascript #json #класс
Вопрос:
У меня есть этот объект:
{
exports: class y {}
}
Теперь я делаю JSON.stringify
над ним:
JSON.stringify({
exports: class y {}
})
Но он возвращает пустой объект… Что я сделал не так? Спасибо
Комментарии:
1. Каким вы хотели бы видеть результат?
2. что — то вроде
"{"exports": class y {}}"
3. JSON был стандартизирован задолго до того, как в JavaScript появился синтаксис класса, так что это был бы недопустимый JSON. Вы можете ознакомиться со спецификацией для JSON по адресу json.org
4. «Значением может быть строка в двойных кавычках, или число, или true, или false, или null, или объект, или массив » json.org
Ответ №1:
class
на самом деле это функция без [[call]]
внутреннего свойства. Этот тип не имеет представления в JSON, отсюда и результат, который вы видите. Вы можете попробовать JSON.stringify
объекты, содержащие function
, чтобы увидеть тот же результат.
Как правило, вы никогда не должны пытаться сохранить код в виде данных в JS. Хранение кода является сложной задачей и требует от вас хранения большого количества информации о коде, но также и о state
среде. Посмотрите на babel и его api как на пример манипулирования кодом как данными.
Комментарии:
1. Итак, что мне делать?
2. Расскажите нам, что вы на самом деле хотите сделать, было бы хорошим началом. Классы не могут быть представлены в JSON, поэтому, если это актуальный вопрос, ответ заключается в том, что это невозможно.
3. Вам необходимо предоставить значение типа, которое имеет допустимое представление в JSON. Это могут быть объекты, массивы, строки, число, логическое значение и null. Другие типы, присутствующие в качестве значения поля, приведут к игнорированию поля при сериализации структуры в строку json. Почему вы пытаетесь сериализовать
class
именно для этого?4. Я пытаюсь сохранить объект с классом в localStorage
5. Таким образом невозможно добиться сохранения. То, что вы пытаетесь сохранить здесь, является произвольным конструктором класса, который является кодом, а не данными. Вы могли бы сохранить обычное объектное представление вашего кода, используя какой-нибудь «тег», указывающий на соответствующий класс, но я бы не советовал идти этим путем, поскольку поддержание обратной и прямой совместимости может очень быстро усложниться.