我目前正在使用javascript中的伪对象结构。例如:
MyObj = function(options) {
options = options || {};
this.valueA = options.valueA || 'A';
this.valueB = options.valueB || 'B';
this.valueC = options.valueC || 'C';
this.valueD = options.valueD || 'D';
}
MyObj.prototype.doStuff() {
// do stuff
}
现在我需要根据仅包含已更改的属性的JSON数据更新上述实例。
目前我正在使用类似的功能:
MyObj.prototype.update(obj) {
if(obj.valueA) this.valueA = obj.valueA;
if(obj.valueA) this.valueB = obj.valueB;
if(obj.valueA) this.valueC = obj.valueC;
if(obj.valueA) this.valueD = obj.valueD;
}
现在在上面的例子中,一切都运行正常,但是我定义的一些对象非常大,而且一些属性并不简单(因为if(x)
不够用)。这使得代码既凌乱又复杂。恕我直言的复杂性是,当我引入新属性时,我被迫保持两个不同的位置。这让我很担心,因为我知道这可能是引入缺陷的原因。
所以我的问题是,是否有一个javascript机制,我可以用来将对象的属性应用到我的'MyObj'实例?我对我的方法不满意,我发现很难找到关于这个主题的问题(怀疑这是由于我对这些实体的正确javascript术语缺乏了解)。
顺便说一句,obj是通过解析JSON数据创建的。
答案 0 :(得分:1)
您在寻找某种合并机制吗?
这对你有用吗?
var recursiveObjectMerge = function( primary, overwrite ){
var p;
for( p in overwrite ){
try{
//try an update
if( overwrite[p].constructor == Object ){
primary[p] = recursiveObjectMerge( primary[p], overwrite[p] );
}
else{
primary[p] = overwrite[p];
}
}
catch( e ){
// destination doesn't have that property, create and set it
primary[p] = overwrite[p];
}
}
// primary is modified (it's a reference), but pass it back
// to keep up the idea that this function returns a result
return primary;
};