如果通过引用传递对象,并且函数是对象,那么有人可以解释这种行为:
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"
答案 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}}本身。
功能参考也是如此。复制函数的引用时,只复制引用值。如果原始内容被差异引用替换,则不会更改从中复制的值。