6

给定以下代码:

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 并没有真正的对象,但它必须有某种方式能够说应该以某种方式对待某些东西,比如强制转换thePersonPerson.

4

5 回答 5

2

这是不可能的

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

于 2012-06-13T14:22:55.487 回答
2

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

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

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

于 2012-06-13T14:24:27.213 回答
2

Like most things that have language constructs in other languages, even though you can't do it directly, there's a way around it in Javascript. Just set up your object to accept all the data it exposes as a constructor:

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

from scratch:

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

(nb - you could use $.extend or the like to update an existing instance instead - but generally it's preferable to use the constructor so you have control over the handling of the object that gets passed in; for example you may want to ignore all except certain properties of the object that's passed in).

于 2012-06-13T14:26:40.340 回答
0

虽然我知道 JS 并没有真正的对象,但它必须有某种方式可以说应该以某种方式对待某事。

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

一般来说,在 JS 中强制转换是没有意义的。如果你这样做

x.someMethod()

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

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

于 2012-06-13T14:25:15.857 回答
0

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

于 2012-06-13T14:25:28.983 回答