結果はなぜ{"a":"b","c":1}
ですか?
var foo = {"a":"b","c":0};
var bar = foo;
bar.c++;
alert(JSON.stringify(foo));
この動作を無効にする方法は?
結果はなぜ{"a":"b","c":1}
ですか?
var foo = {"a":"b","c":0};
var bar = foo;
bar.c++;
alert(JSON.stringify(foo));
この動作を無効にする方法は?
foo
とbar
変数の両方が同じオブジェクトを参照します。そのオブジェクトを変更するためにどの参照を使用するかは重要ではありません。
この動作を無効にすることはできません。これがJavaScriptや他の多くの主要言語の動作方法です。できることは、オブジェクトを明示的に複製することだけです。
var foo = {"a":"b","c":0};
var bar = {"a":foo.a, "c": foo.c};
bar.c++;
まず、Javascriptはポインタを渡さず、わずかに異なる参照を渡します。第二に、残念ながら、 Javascriptのデフォルトの動作を変更する方法はありません。
コンストラクターを作成し、それを使用して、オブジェクトの2つの類似しているが別々のインスタンスを作成することをお勧めします。
function Foo(a, b) {
this.a = a;
this.b = b;
}
var bar1 = new Foo(0, 0);
var bar2 = new Foo(0, 0);
bar2.b++;
console.log(bar1);
console.log(bar2);
>> {a:0, b:0};
>> {a:0, b:1};
あなたがしているのは、オブジェクトへの2番目の参照を作成することですが、必要なのは、代わりにそのオブジェクトのコピーです。
その機能が必要な場合は、すべてのプロパティを1つずつ新しいオブジェクトにコピーするコピー関数が本当に必要です。
// Take all the properties of 'obj' and copy them to a new object,
// then return that object
function copy(obj) {
var a = {};
for (var x in obj) a[x] = obj[x];
return a;
}
var foo = {"a":"b","c":0};
var bar = copy(foo);
bar.c++;
alert(JSON.stringify(foo));
そして、あなたは得るでしょう{"a":"b","c":0}
javascriptの動作を無効にすることはできません。
参照オブジェクトを変更すると、すべてのオブジェクト参照に影響します。