代码之家  ›  专栏  ›  技术社区  ›  Chris Pietschmann

如何使用JSON创建从对象类型继承的对象?

  •  12
  • Chris Pietschmann  · 技术社区  · 17 年前

    我知道如何使用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!
    
    3 回复  |  直到 17 年前
        1
  •  13
  •   nickf    17 年前

    我不这么认为。如果我是你的话,我会在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];
        }
    }
    
        2
  •  4
  •   Aupajo    17 年前

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

    var you = new Person({ firstName: 'Mike' });
    
        3
  •  2
  •   harley.333    17 年前

    你可以从他们那里得到一个物体。您的构造函数可以接受您想要的对象,但以不受影响的方式调用它们的构造函数:

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

    或者类似的事情:)