13

我知道如何使用 JSON 来创建对象,但似乎没有办法使用 JSON 来创建特定对象类型的对象。

这是一个对象的示例并创建它的一个实例:

Person = function() { };
Person.prototype = {
    FirstName: null,
    GetFirstName: function() {
        return this.FirstName;
    }
};

//Create an instance of the Person Object
var me = new Person();
me.FirstName = "Chris";
alert(me.GetFirstName()); //alert the FirstName property

现在,我想使用 JSON 创建一个新的 Person 对象,以便 GetFirstName 函数对其进行处理。

这是我想做的事情(但这段代码不起作用):

var you = new Person() { FirstName: "Mike" };
// OR
var you = new Person{ FirstName: "Mike" };

反正有没有使用 JSON 来创建一个特定类型的对象?

更新:我的 Person 对象示例只是为了简化问题。事实上,我无法修改需要创建实例的实际对象的构造函数。这些对象是第三方库的一部分。

更新:使用下面的一些建议,我能够找到一种方法来创建一个继承自原始对象的对象,并在其构造函数中接受 JSON。这很整洁!

personWrapper = function(obj){
    for(var o in obj){
        this[o] = obj[o];
    }
};
personWrapper.prototype = new Person();

var you = new personWrapper({FirstName: "Chris"});
alert(you.GetFirstName());
alert(you instanceof Person); // returns True - we are successfully inheriting from Person!
4

3 回答 3

15

我不这么认为。如果我是你,我会在 Person 类上创建一个函数来从 JSON 对象初始化。

function Person() {
    this.loadFromJSON = function(json) {
        this.FirstName = json.FirstName;
    };
}

如果您事先不知道 JSON 对象表示的是什么类,则可以在 JSON 中添加一个额外的变量。

{ _className : "Person", FirstName : "Mike" }

然后有一个解释它的“构建器”函数。

function buildFromJSON(json) {
    var myObj = new json["_className"]();
    myObj.loadFromJSON(json);
    return myObj;
}

更新:由于您说该类是您无法更改的第三方库的一部分,您可以使用原型扩展该类,或者编写一个仅在外部填充该类的函数。

例如:

Person.prototype.loadFromJSON = function(json) {
    // as above...
};

或者

function populateObject(obj, json) {
    for (var i in json) {
        // you might want to put in a check here to test
        // that obj actually has an attribute named i
        obj[i] = json[i];
    }
}
于 2008-10-09T00:06:46.347 回答
4

您可以允许 new Person() 接受一个对象来填充属性作为参数。

var you = new Person({ firstName: 'Mike' });
于 2008-10-09T00:09:11.037 回答
2

您可以从他们的对象中派生出一个对象。您的构造函数可以接受您想要的对象,但以不受影响的方式调用它们的构造函数:

function yourWrapper(obj) {
    theirObject.call(this);
    for (var s in obj) {
        this[s] = obj[s];
    }
}
yourWrapper.prototype = new theirObject();

或类似的东西 :)

于 2008-10-09T04:03:51.017 回答