2015-11-14 155 views
0

我試圖實現一個愚蠢的代碼,一個基礎對象,它有一個'私人'成員(閉包變量),並基於該對象的兩個對象。看起來這兩個對象操縱相同的閉包變量關閉對象之間共享變量

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代碼只執行一次,這有點解釋了這一點。

我的問題:

是否有保持「私人」變量而創建多個對象關閉包的方法嗎?我找不到任何聰明的解決方法,我很樂意避免將該變量設置爲公開訪問。

+0

如果你想擁有的每個對象的「私人範圍」,你需要在實例爲 – dandavis

+2

執行一個功能,你必須創建一組新你創建一個對象,而不是一次。 –

+0

嘿,正如我所說我很確定我明白爲什麼發生這種情況,想知道是否有解決方法:) – Patrick

回答

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