@b4rret

Как сохранить тип объекта в JavaScript после JSON преобразований?

Прошу прощения, за нубский вопрос, только начинаю изучать JS.
Имеется следующий конструктор
function User(id, name) {
  this.id = id;
  this.name = name;
}

Далее
var user = new User(1, 'Вася');

var json = JSON.stringify(user);
var user2 = JSON.parse(json);

console.log(user2 instanseof User); // false

Как сделать так чтобы возвращалось true?
  • Вопрос задан
  • 360 просмотров
Решения вопроса 1
Такого механизма нету. Можно использовать нечто подобное (рабочий пример https://jsfiddle.net/83bun7xt/ ):
function serialize(entity) {
    return JSON.stringify({ type: entity.constructor.name, data: entity });
}

function deserialize(str, types) {
    var parsed = JSON.parse(str);
    return types[parsed.type] ? new types[parsed.type](parsed.data) : {};
}

function User(data) {
  this.id = data.id;
  this.name = data.name;
}

var user = new User({ id: 1, name: 'Nik' });
console.log('User ->', user, ' instanceOf User ===', user instanceof User);
// User -> User {id: 1, name: "Nik"}  instanceOf User === true

var userJSON = serialize(user);
console.log('Serialized user ->', userJSON);
// Serialized user -> {"type":"User","data":{"id":1,"name":"Nik"}}

var restoredUser = deserialize(userJSON, { 'User': User });
console.log('Deserialized user ->', restoredUser, ' instanceOf User ===', restoredUser instanceof User);
// Deserialized user -> User {id: 1, name: "Nik"}  instanceOf User === true

//
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Dark_Scorpion
@Dark_Scorpion
Такого механизма нету, потому что сравниваются объекты, а они разные! Но можно сравнивать, не по ссылке, а по содержанию, т.е. сравнивать строки json или пробежаться по полям сравнивая их значения.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы