何时复制对象而不是作为引用传递'

时间:2013-10-05 13:14:45

标签: javascript pass-by-reference

如果通过引用传递对象,并且函数是对象,那么有人可以解释这种行为:

function extendCopy(p){
  var c = {}
  for (var i in p){
     c[i] = p[i];
  }
  c.uber = p;
  return c;
}
var shape = {
   name: "shape";
   toString: function (){ return name; }
}
var twoDee = extendCopy(shape);
twoDee.toString = function() { return "2d shape" }

>>>shape.toString
>>>function (){ return name; }

为什么twoDee.toString不仅仅是对shape.toString的引用?当然,复制函数中的行c[i] = p[i];只是将新对象的属性设置为对复制对象中相同属性的引用?

修改

这可以简化:

如果函数是对象并通过引用传递对象,为什么返回"test"而不返回"modified"?是因为我实际上完全替换了“对象”(函数),第3行是新的吗?

a.toString = function(){ return "test" };
b.toString = a.toString;
a.toString = function(){ return "modified" };
b.toString();
>>> "test"

1 个答案:

答案 0 :(得分:1)

复制作为对象引用的属性值仅复制引用。它不会导致值的接收者成为对其他属性的引用。

示例:

var a = { x: { name: 'John' } };
var b = {};

b.x = a.x; // b.x points to the same object as a.x;

a.x = { name: 'Peter' }; // a.x points to a different object, b.x is unchanged

将值从a.x复制到b.x时,b.x的值是对a.x指向的同一对象的引用,它不是对a.x的引用{{1}}本身。

功能参考也是如此。复制函数的引用时,只复制引用值。如果原始内容被差异引用替换,则不会更改从中复制的值。