JSON.stringify() не работает с объектом с классом

#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. Таким образом невозможно добиться сохранения. То, что вы пытаетесь сохранить здесь, является произвольным конструктором класса, который является кодом, а не данными. Вы могли бы сохранить обычное объектное представление вашего кода, используя какой-нибудь «тег», указывающий на соответствующий класс, но я бы не советовал идти этим путем, поскольку поддержание обратной и прямой совместимости может очень быстро усложниться.