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