我环顾四周,没有找到任何可以帮助我的东西。为什么我不能在不使它们量子纠缠的情况下克隆具有私有(private)成员的 javascript 对象?
看看这段代码...这是一个带有 getter 和 setter 的普通私有(private)属性。 不知何故,如果我在一个实例上调用 public setter,克隆的实例也会发生变化。为什么?可以变通吗?
obj = function(){
var changed = 0;
this.getChanged = function(){
return changed;
}
this.setChanged = function(){
changed = 1;
}
this.setUnchanged = function(){
changed = 0;
}
};
myObj = new obj();
copiedObj = $.extend(true, {}, myObj); // Or any other deep copy function you'd have around
myObj.setChanged();
myObj.getChanged(); // returns 1
copiedObj.getChanged(); // returns 1!
copiedObj.setUnchanged();
copiedObj.getChanged(); // returns 0
myObj.getChanged(); // returns 0
感谢您的任何想法。
编辑:到目前为止,没有新内容。我知道 javascript 并不像 Java 或 C++ 那样真正具有 OO,但是嘿,我们在谈论编程语言,总有一种出路。有时它很丑,但有一个。
我明白了。
解决方案 A:只需将其设为 this.changed 而不是 var changed
解决方案 B:创建我自己的克隆函数,重新构建整个对象
我只是希望有一些解决方案 C 可以将 javascript 引入标准的面向对象模式。
有人,我真的坚持使用 A 还是 B?
最佳答案
问题是 changed 不是私有(private)变量——JavaScript 没有私有(private)变量。它是您分配给 obj 变量的函数的局部变量。当您创建分配给 getChanged/setChanged/setUnchanged 属性的函数时,您正在创建 closures对变量changed 关闭。
当您克隆 myObj 时,您只是为这些函数创建了额外的别名。因此,无论您是通过 myObj 还是 copiedObj 访问它们,您仍然在调用相同的函数,并且因为它们是闭包,所以您访问的是完全相同的 < strong>changed 两种情况下的变量。由于您无法复制函数,因此最好不要尝试将 changed 设为私有(private),而只是在第二行执行 this.changed = 0;。
关于javascript - 使用私有(private)成员复制 javascript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3928465/