1

Javascriptで次のようなものがあるとしましょう:

obj1.prop1.prop1_1.prop1_1_1 = 3;

これが呼び出されると、値 3 が同じツリーの場所に設定されますが、obj2 で、次のように呼び出されます。

obj2.prop1.prop1_1.prop1_1_1 = 3;

これにはすべて、obj2 に最初に prop1.prop1_1.prop1_1_1 が入力されていないという制約があります。

最初のステップは、obj1.prop1 をオーバーライドして、obj2.prop1 を返すことだと思います。ただし、obj2.prop1 は obj1.prop1 と同じタイプのインスタンスに割り当てる必要があります。どうすればそれができますか?

4

2 に答える 2

1

私があなたを正しく理解していて、同じオブジェクトobj1.prop1.prop1_1ではなく、前者に適切に設定して、後者に同じプロパティをobj2.prop1.prop1_1設定したい場合。prop1_1_1

これは、ES5 の時点でプロパティの getter および/または setterで可能ですが、お勧めしません。:-)

obj2.prop1.prop1_1.prop1_1_1ゲッター onが から値を取得する例を次に示しますobj1

var obj1 = {
    prop1: {
        prop1_1: {
            prop1_1_1: 42
        }
    }
};
var obj2 = {
    prop1: {
        prop1_1: {
        }
    }
};
Object.defineProperty(obj2.prop1.prop1_1, "prop1_1_1", {
    get: function() {
        return obj1.prop1.prop1_1.prop1_1_1;
    }
});
console.log("obj1.prop1.prop1_1.prop1_1_1 = " + obj1.prop1.prop1_1.prop1_1_1); // 42
console.log("obj2.prop1.prop1_1.prop1_1_1 = " + obj2.prop1.prop1_1.prop1_1_1); // 42
obj1.prop1.prop1_1.prop1_1_1 = 3;
console.log("obj1.prop1.prop1_1.prop1_1_1 = " + obj1.prop1.prop1_1.prop1_1_1); // 3
console.log("obj2.prop1.prop1_1.prop1_1_1 = " + obj2.prop1.prop1_1.prop1_1_1); // 3

ライブコピー(コンソールを見てください) | ソース

于 2012-11-29T15:25:28.383 に答える
1

TJ Crowder の仮定が正しければ、次のことができます。

obj1.prop1.prop1_1.prop1_1_1= [3]


obj2.prop1.prop1_1.prop1_1_1= obj1.prop1.prop1_1.prop1_1_1

obj2.prop1.prop1_1.prop1_1_1[0] を変更すると、obj1.prop1.prop1_1.prop1_1_1[0] も変更されます。

[3] と定義すると、実際には Array オブジェクトが作成され、その参照 (別名ポインター) が obj1.prop1.prop1_1.prop1_1_1 に格納されるため、obj1.prop1.prop1_1.prop1_1_1 と obj2.prop1.prop1_1 の両方が格納されます。 prop1_1_1 は、同じ配列への同じ参照を持ちます。メモリには配列が 1 つしかありませんが、配列への 2 つの参照があり、一方を変更すると他方も変更されます。

obj1.prop1.prop1_1.prop1_1_1= 3 を使用する場合、この場合、prop1_1_1 はプリミティブであり、オブジェクトへの参照ではありません。だからあなたが言うなら

obj1.prop1.prop1_1.prop1_1_1= obj2.prop1.prop1_1.prop1_1_1

実際には値3を他の変数にコピーし、メモリ内の2つの異なる場所に値3を保持させ、一方を変更しても他方は変更されません

于 2012-11-29T15:29:26.733 に答える