Есть несколько способов справиться с этим, и ни один из них не является особенным для WinJS. Проще говоря: сериализация JSON сериализует и десериализует только значения объекта, а не его методы, прототип или другую информацию о типе.
Вариант 1. Скопируйте значения в новый экземпляр вашего класса. Обычно это лучше всего сделать, если ваш конструктор принимает десериализованный объект в качестве параметра и копирует данные в новый экземпляр.
Есть множество вариаций этого. Использование конструктора объекта, как правило, лучше всего подходит для повышения производительности, так как это обычно позволяет движку JS применять к объекту большее количество оптимизаций.
Здесь может помочь WinJS.UI.setOptions, или вы можете просто скопировать данные, используя простой цикл, подобный этому:
var keys = Object.keys(source);
for (var i = 0, len = keys.length; i < len; i++) {
var key = keys[i];
destination[key] = source[key];
}
Вариант 2. Установка __proto__ Предупреждение. Это может привести к значительному снижению производительности, поэтому в некоторых ситуациях не подходит. Но иногда это может быть удобно.
Object.setPrototypeOf(myObject, myClass.prototype);
Обратите внимание, что setPrototypeOf является относительно новым. Он есть в Win8.1 для веб-приложений (о чем, я полагаю, речь идет) и в IE 11, но недоступен, например, в Safari. В старых браузерах/Safari назначение proto является эквивалентом (но если доступно, setPrototypeOf лучше).
Это прикрепит методы из myClass к объекту, но в дополнение к отрицательному влиянию на производительность также не запустит ваш конструктор для объекта, поэтому он все еще может быть не в том же состоянии, что и объект, который вы изначально сериализовали.
Другая полезная вещь: JSON "возрождает" JSON.parse принимает необязательный второй параметр, который называется "восстановитель". Это позволяет вам предоставить функцию, которая получает возможность преобразовать каждый узел десериализуемого JSON. Это может быть полезно, например, для преобразования сериализованных дат в объекты Date JavaScript. Он также получает возможность преобразовать самый верхний объект, что может быть полезно в некоторых случаях для превращения десериализованного объекта в нужный вам «класс».
26.04.2015