【发布时间】:2013-10-05 13:14:45
【问题描述】:
如果对象是通过引用传递的,而函数是对象,那么有人可以解释一下这种行为:
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"
【问题讨论】:
-
这个例子是错误的;
john被回显。改为显示真实代码。 -
哦,你是对的,让我调整一下问题
-
如果控制台使用缓存,您偶尔会在控制台中看到错误结果
-
Javascript 总是按值传递参数(对于一个对象,该值是一个引用),但无论如何这不适用于您拥有的代码,因为您根本没有传递任何参数。
-
我试图过度简化问题,我已经发布了让我感到困惑的代码
标签: javascript pass-by-reference