我可能不是第一个这样做的人,但我无法找到或弄清楚如何做到这一点。
在我的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;
};
}
并且profile
和company
对象也有数据和函数。
现在我从服务器获取一个对象,它是同一个对象,但只有数据,而不是函数。
现在我想将检索到的对象的所有属性从服务器投射到我的JavaScript对象。
我已经阅读过使用jQuery Extend,但这对我不起作用,因为它只保留根(Maindata)对象上的函数,但不保留子对象上的函数。
如何加载子对象的所有数据呢?
我是否必须逐个扩展子对象,如下所示:
$.extend(true, maindata.profile, result.profile);
$.extend(true, maindata.company, result.company);
还是有另一种解决方案吗?
答案 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执行相当糟糕的工作并且自己执行此操作非常简单。