将javascript对象从服务器加载到现有的javascript对象中

时间:2016-02-29 12:48:25

标签: javascript jquery

我可能不是第一个这样做的人,但我无法找到或弄清楚如何做到这一点。

在我的javascript中,我有一个具有5个属性的对象,它们都是对象withg数据属性和函数。

所以看起来像这样

function Maindata() {
    var obj = this;
    this.id = null;
    this.profile= new Profile();
    this.company= new Company();
    //and more
    this.getid = function(){
        return obj.id;
    };
}

并且profilecompany对象也有数据和函数。

现在我从服务器获取一个对象,它是同一个对象,但只有数据,而不是函数。

现在我想将检索到的对象的所有属性从服务器投射到我的JavaScript对象。

我已经阅读过使用jQuery Extend,但这对我不起作用,因为它只保留根(Maindata)对象上的函数,但不保留子对象上的函数。

如何加载子对象的所有数据呢?

我是否必须逐个扩展子对象,如下所示:

$.extend(true, maindata.profile, result.profile);
$.extend(true, maindata.company, result.company);

还是有另一种解决方案吗?

1 个答案:

答案 0 :(得分:2)

首先,一般来说 - 您希望将所有功能放在原型上,并将所有数据放在对象本身上:

function Maindata() {
    var obj = this;
    this.id = null;
    this.profile= new Profile();
    this.company= new Company();
    //and more
}
Maindata.prototype.getid = function() {
    return this.id;
};

原型被分配给使用Maindata创建的每个对象作为构造函数,并且在所有Maindata个实例中共享。因此,它可能更有效,更容易推理。它有点像其他语言的类。

这意味着您可以:

// creates an object with the given prototype without running the constructor
var o = Object.create(Maindata.prototype); 
$.extend(o, result); // copy data over
// Object.assign(o, result); // with ES2015 assign syntax.

如果您的对象是嵌套的 - 那么您需要以嵌套的方式为子属性执行此操作。您不能免费获取类型,因为它们不是以JSON编码的。您可以实现一个自动为您执行此操作的自定义序列化程序 - 一些像Backbone这样的库为您执行此操作但IMO执行相当糟糕的工作并且自己执行此操作非常简单。