1

我被一个更大的 JavaScript 应用程序(使用 jQuery Mobile)困住了,其中大部分程序逻辑已经实现。现在我想向它添加序列化(使用一个名为 JStorage 的插件)。在此代码示例中,我将一个对象字符串化为 JSON,然后再次将其转换为一个对象(全部没有 JStorage),但是我添加到原始对象的方法会丢失,如下代码所示:

function TestObject() {
    this.lang = "English";
}

// This is the method I want to keep
TestObject.prototype.showLang = function() {
    console.log(this.lang)
};

var test1 = new TestObject();
var test2 = $.parseJSON(JSON.stringify(test1)); // After save and reload
test1.showLang(); // This works
test2.showLang(); // This causes an error

问题还有另一个限制:在代码中,我经常使用点运算符来调用函数,如test1.showLang()。我知道我可以添加一个像这样的“全局”函数,它适用于原件和副本:

function showLang(obj) {
    console.log(obj.lang);
}

但是随后我必须将对函数的每个现有调用从test1.showLang()更改为showLang(test1) - 在我的实际项目中 - 我必须在整个代码中执行数百次。那么有没有更简单的解决方案如何在序列化后在对象上使用现有函数?

4

2 回答 2

1

据我所知,JSON 没有能力序列化方法然后反序列化它们。它主要用于 DTO(数据传输对象),而不是对象代理。

附带说明的是,如果 JSON 确实支持它,它可能是一个重大的安全漏洞。

于 2014-11-24T13:21:51.993 回答
0

您可以更改TestObject构造函数,以便它可以接受包含其所有属性的可选初始值的对象:

function TestObject(properties) {
    this.lang = (properties && !(properties.lang === undefined)) ? properties.lang : "English";
}

然后使用您的反序列化对象使用构造函数创建一个新对象,而不是直接使用反序列化对象:

var test2 = new TestObject( $.parseJSON(JSON.stringify(test1)) );

这似乎有效:http: //jsfiddle.net/wubfckez/

于 2014-11-24T14:07:03.067 回答