使用私有成员复制javascript对象
我到处找了找,没有找到什么可以帮助我的。为什么我不能克隆一个包含私有成员的javascript对象,而不让它们陷入量子纠缠 看看这个代码。。。这是一个带有getter和setter的普通私有财产。 不知何故,如果我在一个实例上调用公共setter,克隆的实例也会被更改。为什么?这能解决吗使用私有成员复制javascript对象,javascript,object,clone,private,Javascript,Object,Clone,Private,我到处找了找,没有找到什么可以帮助我的。为什么我不能克隆一个包含私有成员的javascript对象,而不让它们陷入量子纠缠 看看这个代码。。。这是一个带有getter和setter的普通私有财产。 不知何故,如果我在一个实例上调用公共setter,克隆的实例也会被更改。为什么?这能解决吗 obj = function(){ var changed = 0; this.getChanged = function(){ return changed; }
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并没有真正的OO,比如java或C++,但是我们在谈论编程语言,总是有一条出路。有时候很难看,但有一个
我明白了。
解决方案A:只需将其设置为this.changed而不是var changed解决方案B:创建我自己的克隆函数,重新构建整个对象 我只是希望有一些解决方案C能够将javascript欺骗成标准的面向对象模式
有人问,我真的被A或B卡住了吗?函数中用作构造函数的局部变量被称为“私有成员”,这样Java大众就可以理解使用的意图。它不像一个财产。它是词法范围内的局部变量。它是实例的“私有”,而不是类。javascript中没有类
最好的选择是添加一个克隆方法,该方法将深度复制实例。函数中用作构造函数的局部变量称为“私有成员”,以便Java大众能够理解使用的意图。它不像一个财产。它是词法范围内的局部变量。它是实例的“私有”,而不是类。javascript中没有类
您最好的选择是添加一个将深度复制实例的克隆方法。即使是深度复制也不能将函数复制为引用。由于函数是闭包,它们都共享相同的私有成员。为什么不编写一个
clone()
方法呢?即使是深度拷贝也不能将函数复制为引用。由于函数是闭包,它们都共享相同的私有成员。为什么不写一个clone()
方法呢?问题是changed不是私有变量——JavaScript没有私有变量。它是分配给obj变量的函数的局部变量。当您创建分配给getChanged/setChanged/setUnchanged属性的函数时,您正在创建在变量changed上关闭的函数
克隆myObj时,只需为这些函数创建附加别名。因此,无论您是通过myObj还是copiedObj访问它们,您仍然在调用相同的函数,并且因为它们是闭包,所以在这两种情况下,您访问的是完全相同的changed变量。由于无法复制函数,因此最好不要尝试将更改为私有,而只是执行this.changed=0在第二行。问题是更改的不是私有变量——JavaScript没有私有变量。它是分配给obj变量的函数的局部变量。当您创建分配给getChanged/setChanged/setUnchanged属性的函数时,您正在创建在变量changed上关闭的函数 克隆myObj时,只需为这些函数创建附加别名。因此,无论您是通过myObj还是copiedObj访问它们,您仍然在调用相同的函数,并且因为它们是闭包,所以在这两种情况下,您访问的是完全相同的changed变量。由于无法复制函数,因此最好不要尝试将更改为私有,而只是执行this.changed=0在第二行。得到了答案 吉莉的暗示起了作用 事实上,我使用的克隆/深度复制函数不是jQuery的,而是jQuery的 我不得不用两种方法来调整它,以达到我的预期效果。事实上,原作者在他的解释中已经指出了方向,但我在第一次阅读时没有领会。
首先,我用原始对象的构造函数实例化了副本,
从for in循环中筛选出函数 这是结果。希望这能帮助别人
function clone(obj) {
// Handle the 3 simple types, and null or undefined
if (null == obj || "object" != typeof obj) return obj;
// Handle Date
if (obj instanceof Date) {
var copy = new Date();
copy.setTime(obj.getTime());
return copy;
}
// Handle Array
if (obj instanceof Array) {
var copy = [];
for (var i = 0, len = obj.length; i < len; ++i) {
copy[i] = clone(obj[i]);
}
return copy;
}
// Handle Object (functions are skipped)
if (obj instanceof Object) {
var copy = new obj.constructor();
for (var attr in obj) {
if (obj.hasOwnProperty(attr) && !(obj[attr] instanceof Function)) copy[attr] = clone(obj[attr]);
}
return copy;
}
throw new Error("Unable to copy obj! Its type isn't supported.");
}
功能克隆(obj){
//处理3个简单类型,以及null或undefined
如果(null==obj | |“object”!=typeof obj)返回obj;
//处理日期
if(obj实例截止日期){
var copy=新日期();
copy.setTime(obj.getTime());
返回副本;
}
//句柄数组
if(阵列的obj实例){
var copy=[];
对于(变量i=0,len=obj.length;i
得到了答案
吉莉的暗示起了作用
事实上,我使用的克隆/深度复制函数不是jQuery的,而是jQuery的
我不得不用两种方法来调整它,以达到我的预期效果。事实上,原作者在他的解释中已经指出了方向,但我在第一次阅读时没有领会。首先,我用原始对象的构造函数实例化了副本,
从for in循环中筛选出函数 这是