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