2

こんにちは、助けてくれてありがとう

コードを書いているときに、問題が発生しました。以下の例では。がalert(a.x)1 を出力すると思っていたのに、2 が出力aされてしまうthis.bのです。私が見つけられないように見えるのは、代わりに値で渡す方法です。a(のように、呼び出すたびに変更したくありませんx()

var a = {"x":1}

function x() {
  this.b = v;
  this.b.x++;
}

x();

alert(a.x); //prints 2

また、次のバリアントと他のバリアントを試してみましたが、役に立ちませんでした...

var a = {"x":1}

function x(v) {
  this.b = v;
  this.b.x++;
}

x(a);

alert(a.x); //... still prints 2

私が欠けているものについて誰かが私に手がかりを与えることができますか?

よろしくお願いします

(補足:これは私が話していることに近い投稿ですが、自分の状況に適用する方法がわかりませんでした...まったく同じ状況であれば)

4

2 に答える 2

0

何が起こっているのかを分析することで、明確にすることができるかもしれません。

var a = {"x":1} // a refers to object with key "x"

function x(v) {  // v is now a reference to the object with key "x"
  this.b = v;   // this.b now is a reference to the object with key "x"
  this.b.x++;   //this.b.x++ points to the object with key "x" so it can increment it's value.
}

x(a);  // passes in a the value of reference to object with key "x"

alert(a.x); //... still prints 2

このリンクで見つけることができる何かを行うことができます:

var o = {};
(function(x){
    var obj = Object.create( x );
    obj.foo = 'foo';
    obj.bar = 'bar';
})(o);

alert( o.foo ); // undefined
于 2013-07-23T04:22:07.367 に答える
-1

電話すると:

x(a);

いくつかのことが起こっています。まず、変数a(オブジェクトへの参照を保持するだけ) が値によって関数に渡されますxx現在、その参照の独自のコピーがあり、メモリ内の同じオブジェクトを指しています。したがって、その参照されたオブジェクトのプロパティに加えた変更は、そのオブジェクトへの他の参照に影響します。

電話すると:

this.b = v;

のコピーを再度作成し、vに設定していthis.bます。現在、avthis.bメモリ内の個別の変数であり、すべて同じオブジェクトへの参照を格納しています。

あなたがしようとしているのは、オブジェクト自体のコピーを作成することです。そのため、1 つの参照を操作して他の参照に影響を与えることはできません。そのためには、メモリ内にまったく新しいオブジェクトを作成し、プロパティをコピーする必要があります。

var a = {"x":1}

function x(v) {
    this.b = {}; // Create a new object
    this.b.x = v.x; // Copy over the x property
    // Copy over any other properties too
    this.b.x++;
}

x(a);

alert(a.x); // The original object still has an x property of 1

this.bは新しいオブジェクトであり、によって参照されるオブジェクトからプロパティをコピーしただけなのでv、インクリメントは指している対象this.b.xに影響を与えませんv

于 2013-07-23T04:25:26.880 に答える