闭包在对象

时间:2015-11-14 23:14:42

标签: javascript closures

我试图实施一个愚蠢的代码,一个拥有私人代码的基础对象。 member(闭包变量),以及基于该对象的两个对象。看来两个对象操纵相同的闭包变量

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代码只执行一次,这有点解释了。

我的问题:

有没有任何方法可以保持私人'从闭包创建多个对象时变量?我无法找到任何聪明的解决方法,我希望避免将该变量设置为可公开访问。

1 个答案:

答案 0 :(得分:2)

这里有你所拥有的

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

这两个对象共享一个公共原型Obj,它有两种方法都可以访问相同的count变量。

你想要的是拥有两个单独的count变量和一个单独的Obj,每个变量都有自己的方法,这些方法关闭count

要做到这一点,只需将IIFE功能转换为命名功能,然后抛弃Object.create

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---/