0

我目前在我的 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;
}

现在在上面的示例中,一切正常,但是我定义的一些对象非常大,并且一些属性并不简单(因为 aif(x)是不够的)。这使得代码既混乱又复杂。恕我直言的复杂性是,当我引入新属性时,我被迫维护两个不同的地方。这让我很担心,因为我知道这可能是引入缺陷的原因。

所以我的问题是,是否有一种 javascript 机制可用于将对象的属性应用于我的“MyObj”实例?我对我的方法不满意,我发现很难搜索关于这个主题的问题(怀疑这是由于我对这些实体的正确 javascript 术语缺乏了解)。

顺便说一句,obj 是通过解析 JSON 数据创建的。

4

1 回答 1

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;
};
于 2013-02-07T05:48:51.713 回答