javascript - 使用私有(private)成员复制 javascript 对象

标签 javascript object clone private

我环顾四周,没有找到任何可以帮助我的东西。为什么我不能在不使它们量子纠缠的情况下克隆具有私有(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/

相关文章:

javascript - 性能以及何时将数据加载到 JS 框架中

javascript - 在jquery中水平滑动淡入淡出

Wordpress 为用户登录生成 WP_Error 对象?

PHP 克隆子代

javascript - string.split() 之后 Switch/case 没有响应

javascript - 基于取消选中复选框隐藏 div

javascript - Google Apps 脚本事件 EventGuest 没有 .getEmail()

java - 在Java中创建数组的数组

javascript - 使用 jquery 在另一个函数上创建克隆

javascript - jQuery 如何修改内存中克隆元素的 html