Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.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_Object_Clone_Private - Fatal编程技术网

使用私有成员复制javascript对象

使用私有成员复制javascript对象,javascript,object,clone,private,Javascript,Object,Clone,Private,我到处找了找,没有找到什么可以帮助我的。为什么我不能克隆一个包含私有成员的javascript对象,而不让它们陷入量子纠缠 看看这个代码。。。这是一个带有getter和setter的普通私有财产。 不知何故,如果我在一个实例上调用公共setter,克隆的实例也会被更改。为什么?这能解决吗 obj = function(){ var changed = 0; this.getChanged = function(){ return changed; }

我到处找了找,没有找到什么可以帮助我的。为什么我不能克隆一个包含私有成员的javascript对象,而不让它们陷入量子纠缠

看看这个代码。。。这是一个带有getter和setter的普通私有财产。 不知何故,如果我在一个实例上调用公共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并没有真正的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循环中筛选出函数

这是