-1

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

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"
4

1 回答 1

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.xinto复制值时b.x, 的值b.x是对指向的同一对象的a.x引用,而不是对a.x自身的引用。

函数引用也是如此。当您复制函数的引用时,您只复制引用值。如果原始被替换为差异引用,则不会更改从中复制的值。

于 2013-10-05T13:47:21.343 回答