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

Javascript 闭包在对象之间共享变量

Javascript 闭包在对象之间共享变量,javascript,closures,Javascript,Closures,我试图实现一个愚蠢的代码,一个有“private”成员(闭包变量)的基本对象,以及基于该对象的两个对象。这两个对象似乎操作同一个闭包变量 Obj = (function(){ var count = 0; function getCount(){ return count; } function setCount(c) { count = c; } return { getCount

我试图实现一个愚蠢的代码,一个有“private”成员(闭包变量)的基本对象,以及基于该对象的两个对象。这两个对象似乎操作同一个闭包变量

Obj = (function(){

    var count = 0;    

    function getCount(){
        return count;
    }

    function setCount(c) {
        count = c;
    }

    return {
        getCount : getCount,
        setCount : setCount
    }

}());

obj1 = Object.create(Obj);
obj2 = Object.create(Obj);

obj1.setCount(10);
obj2.getCount(); // 10? that's.. not so good
因此,我认为原始Obj代码只执行一次,这在某种程度上解释了这一点

我的问题:

在一个闭包中创建多个对象时,有没有办法保留一个“private”变量?我找不到任何灵巧的解决方法,我希望避免将该变量设置为可公开访问的。

以下是您所拥有的

+-------+\
| obj1  | \
+-------+  \ +-------+---getCount---\
             |  Obj  |               var count
+-------+  / +-------+---setCount---/
| obj2  | /
+-------+/
这两个对象共享一个公共原型
Obj
,该原型有两个方法,都访问相同的
count
变量

您想要的是有两个单独的
count
变量和一个单独的
Obj
,每个变量都有自己的方法来结束
count

为此,只需将IIFE函数转换为命名函数,并放弃
对象。创建

function Obj(){

    var count = 0;    

    function getCount(){
        return count;
    }

    function setCount(c) {
        count = c;
    }

    return {
        getCount : getCount,
        setCount : setCount
    }
}

obj1 = Obj();
obj2 = Obj();

obj1.setCount(10);
obj2.getCount(); // 0
现在你有了这个:

+-------+---getCount---\
| obj1  |               var count
+-------+---setCount---/

+-------+---getCount---\
| obj2  |               var count
+-------+---setCount---/

你需要在实例化时执行一个函数,如果你想每个对象都有一个“私有作用域”,你必须在每次创建对象时创建一个新的作用域,而不是一次。嘿,正如我说的,我很确定我理解为什么会发生这种情况,我想知道是否有办法:)您似乎已经知道解决方案是什么:不要只执行一次与
Obj
相关的代码。您只有一个闭包范围。从
Obj
继承并不重要,
obj1.setCount
闭包的功能与
obj2.setCount
完全相同。