在javascript中应用仅包含对另一个对象的更改的对象

时间:2013-02-07 05:38:22

标签: javascript object attributes

我目前正在使用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数据创建的。

1 个答案:

答案 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;
};