反序列化后重新应用JS Prototype函数

时间:2012-06-13 14:20:34

标签: javascript casting

给出以下代码:

function Person(firstName, lastName) {
    this.FirstName = firstName;
    this.LastName = lastName;
}

Person.prototype.showFullName = function() {
    return this.FirstName + " " + this.LastName;
};

var person = new Person("xx", "xxxx");
var jsonString = JSON.stringify(person);

var thePerson = JSON.parse(jsonString);

我的目标是能够在thePerson上调用“showFullName”。虽然我理解JS并不真正有对象,但它必须有某种方式可以说某些事情应该以某种方式处理,比如将thePerson转换为Person

5 个答案:

答案 0 :(得分:2)

这是不可能的

您无法使用以前的方法将JSON字符串转换为对象。

答案 1 :(得分:2)

据我所知,最好的方法是首先构造一个vanilla对象,然后使用类似jQuery的extend将数据放到它上面,即

var thePerson = new Person(); // and make sure the constructor gracefully handles no arguments
jQuery.extend(thePerson, JSON.parse(stringData));

如下所述,如果您只是创建一个浅拷贝,则不需要使用extend。您可以遍历已解析数据的属性并将它们复制到目标对象上。

答案 2 :(得分:2)

就像大多数在其他语言中都有语言结构的东西一样,即使你不能直接做到这一点,在Javascript中还有一种解决方法。只需将对象设置为接受它作为构造函数公开的所有数据:

var data = JSON.parse(jsonString);
var person = new Person(data);

从头开始:

var person = new Person({ FirstName: "xx", LastName: "xxx"});

(nb - 您可以使用$.extend等来更新现有实例 - 但通常最好使用构造函数,以便您可以控制传入的对象的处理;例如,可能想要忽略除传入的对象的某些属性之外的所有属性。

答案 3 :(得分:0)

  

虽然我知道JS确实没有对象,但它必须具有   某种方式能够说些什么应该被对待   方式。

不正确。 JS中有很多对象;函数本身就是对象。 AFAIK唯一不是对象的东西是原始类型。也许你的意思是Javascript没有的概念。这是正确的,因为JS使用原型继承。

从一般意义上说,在JS中,施放是没有意义的。如果你这样做

x.someMethod()

如果在x上定义了someMethod,则会触发,无论x是什么类型。它被称为鸭子打字。

JSON.parse创建object literal。您可以做的最好的事情是创建一个构造函数,该构造函数将对象文字初始化实例的值。

答案 4 :(得分:0)

您可以创建一种包装类,您可以将对象提供给构造函数,它会将每个属性设置为该对象的属性。您可以将其设为“基类”,以便将其用于所有类型的对象。这样,您只需要创建一个从该基类“继承”的类的新实例,并将其与您的对象一起提供。类似于http://backbonejs.org/

中使用的模型