Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 复制对象的引用问题_Javascript - Fatal编程技术网

Javascript 复制对象的引用问题

Javascript 复制对象的引用问题,javascript,Javascript,我需要复制一个对象及其方法。 因此,我对对象进行字符串化,然后对其进行解析,并从原始对象添加方法(但绑定到此新副本) 下面是一些测试: var foo = { bar:2, f: function() { this.bar = 5 } } var bar = copyObject(foo); var baz = copyObject(bar); bar.f(); bar.bar; // 5 baz.f(); baz.bar; // 2 instead of 5..?! baz.f.apply

我需要复制一个对象及其方法。 因此,我对对象进行字符串化,然后对其进行解析,并从原始对象添加方法(但绑定到此新副本)

下面是一些测试:

var foo = { bar:2, f: function() { this.bar = 5 } }
var bar = copyObject(foo);
var baz = copyObject(bar);

bar.f();
bar.bar; // 5

baz.f();
baz.bar; // 2 instead of 5..?!
baz.f.apply(baz); // not working either, baz.bar still 2
为什么副本的副本不能像我期望的那样工作



编辑:在
baz.f
中,由于某种原因,
引用仍然绑定到

它不起作用,因为您只能对函数执行一次
.bind()
此值。
这个
值在您第一次使用
bind()
时基本上是一成不变的,之后,您只需在已经绑定的函数上“绘制另一层”:

函数myFunc(){
console.log(this.a);
}
var f1=myFunc.bind({
a:5
});
变量f2=f1.bind({
a:6
});
f1();

f2()
所以解决方案就是不要在
copyObject()
中调用
.bind()
,对吗?@Barmar是的,我想如果你要任意复制对象及其方法,你就必须放弃对
.bind()
的依赖,只要相信
在对象之间复制方法时,这个
会正常工作(当然,情况并非总是如此)。好吧,感谢您的澄清!现在一切都有意义了:-)没有理由假设原始对象中的函数绑定到该对象。事实上,这样做有点奇怪,因为上下文通常是自动传递的。只有在需要其他对象时才能绑定函数。
。您不只是使用
对象.assign()
?@Barmar使用
对象.assign()
比常规赋值有什么好处?常规赋值不会产生副本。@Barmar有趣!然而,在我的实际代码中,我深度复制了一个复杂的对象,所以我猜
object.assign
不适合。是的,object.assign不进行深度复制。
var foo = { bar:2, f: function() { this.bar = 5 } }
var bar = copyObject(foo);
var baz = copyObject(bar);

bar.f();
bar.bar; // 5

baz.f();
baz.bar; // 2 instead of 5..?!
baz.f.apply(baz); // not working either, baz.bar still 2