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内存中的不同变量,都存储对同一对象的引用。

似乎您正在尝试做的是创建对象本身的副本,因此您可以操纵一个引用而不影响其他引用。为此,您需要在内存中创建一个全新的对象并复制属性。

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 回答