有几种方法可以处理这个问题,没有一种对 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 上用于 Web 应用程序(我猜这是关于)和 IE 11,但在 Safari 中不可用,例如。在较旧的浏览器/Safari 上,分配给proto是等效的(但如果可用, setPrototypeOf 更好)。
这会将 myClass 中的方法附加到对象,但除了负面的性能影响之外,它也不会在对象上运行您的构造函数 - 因此它可能仍然与您最初序列化的对象处于不同的状态。
其他有用的东西:JSON“revivers”
JSON.parse 采用可选的第二个参数,称为“reviver”。这使您可以提供一个函数,该函数有机会转换正在反序列化的 JSON 的每个节点。例如,这对于将序列化的日期重新合成为 JavaScript Date 对象很有用。它还有机会转换最顶层的对象,这在某些情况下可能有助于将反序列化的对象转换为您想要的“类”。