JavaScript通过引用而不是值传递?
这个问题在这里已经有了答案:
你打电话时:
x(a);
有几件事正在发生。 首先,变量a
(它只保存对象的引用)通过值传递给函数x
。 x
现在有自己的那个引用副本,它恰好指向内存中的同一个对象。 因此,您对该引用对象的属性所做的任何更改都会影响对该对象的其他引用。
你打电话时:
this.b = v;
您再次制作v
的副本并将其设置为this.b
现在, a
, v
和this.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.bx
对任何v
指向的内容都没有影响。
所以,也许我可以通过打破发生的事情来提供一些清晰的信息。
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
链接地址: http://www.djcxy.com/p/20813.html