3

私は明らかにJSオブジェクトについて何かを理解していません。

http://jsfiddle.net/q3SCF/2/

function baseObject () {
    var self = this;

    self.value = "value";
    self.nestedObject = function () {
        var nest = this;

        nest.value = self.value;
        nest.deepNest = function() {
            var deep = this;

            deep.value = nest.value;
            deep.selfValue = self.value;
        };
    };
    self.nestedObject2 = {
        value: self.value,
        deepNest: {
            value: this.value,
            selfValue: self.value
        }
    };
}

フィドルを分解して、質問を明確にしようとします。

JS オブジェクトについての私の理解では、値で渡されている間、あるオブジェクトが別のオブジェクトと等しく設定されている場合、それらは両方とも同じ値を指す必要があるため、元のオブジェクトが更新されると、それに等しく設定されたオブジェクトは次のようになります。アップデート。

参照: Javascript ポインター/参照の狂気。誰かがこれを説明できますか?

まず、私はそれが起こるとは思っていません (そして、それが私が望んでいることです)。しかし、さらに奇妙なことに、値が十分に深くネストされている場合、ベースオブジェクトを変更すると、値が実際に NULL になることがわかります。助けてください。私は明らかに何かが欠けています。

あなたの JS エンジンが私のものとは違うことをしている場合に備えて、私のコンピューター (Chrome で実行されている Windows 7) での結果は次のとおりです。

深くネストされた値はすべて Null に変わり、変更される値は元の値だけです。

4

2 に答える 2

2

プレゼンテーション コード/マークアップが間違っています。

を使用console.log(object)して、いつでもオブジェクトの構造を確認できます。(最初のレベルでは、オブジェクトを展開すると、展開時の構造が表示されます。)

例えば:

コンソール

于 2013-08-01T21:21:15.113 に答える
1

JS オブジェクトについての私の理解では、値で渡されている間、あるオブジェクトが別のオブジェクトと等しく設定されている場合、それらは両方とも同じ値を指す必要があるため、元のオブジェクトが更新されると、それに等しく設定されたオブジェクトは次のようになります。アップデート。

Javascript は参照を値渡しでコピーします。あなたの例では、すべての変数が元のへのコピーされた参照を保持していますself.value。その変数のみに新しい値を割り当てると、その新しい値への参照が保持されます。self.value他のすべては、依然として古い参照を指しています。

シナリオを機能させる唯一の方法は、オブジェクトを作成しself.valueてプロパティを読み取ることです。このプロパティが変更されても、元のオブジェクトへの参照は失われません。

http://jsfiddle.net/q3SCF/13/

function baseObject () {
    var self = this;

    self.value = {p:"value"};
    self.nestedObject = function () {
        var nest = this;

        nest.value = self.value;
        nest.deepNest = function() {
            var deep = this;

            deep.value = nest.value;
            deep.selfValue = self.value;
        };
    };
    self.nestedObject2 = {
        value: self.value,
        deepNest: {
            value: this.value,
            selfValue: self.value
        }
    };
}
于 2013-08-01T21:23:55.997 に答える