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)が適切でないため)。これにより、コードが煩雑で複雑になります。複雑なのは、新しい属性を導入するときに 2 つの別々の場所を維持する必要があることです。これがどのように導入された欠陥の原因になるかを知っているので、これは私にとって懸念事項です。

したがって、私の質問は、オブジェクトの属性を「MyObj」のインスタンスに適用するために使用できる JavaScript メカニズムはありますか? 私は自分のアプローチに満足しておらず、この件に関する質問を検索するのが難しいと感じています (これは、これらのエンティティの正しい 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 に答える