2012-11-05 139 views
0

我想我不明白JavaScript模塊模式。Javascript和模塊模式

我剛剛創建這個模塊:

var mycompany = {}; 
mycompany.mymodule = (function() { 
    var my = {}; 
    var count = 0; 

    my.init = function(value) { 
     _setCount(value); 
    } 

    // private functions 
    var _setCount = function(newValue) { 
     count = newValue; 
    } 
    var _getCount = function() { 
     return count; 
    } 

    my.incrementCount = function() { 
     _setCount(_getCount() + 1); 
    } 
    my.degreeseCount = function() { 
     _setCount(_getCount() - 1); 
    } 

    my.status = function() { 
     return count; 
    } 

    return my; 
})(); 


var a = mycompany.mymodule; 
var b = mycompany.mymodule; 
console.debug(a, 'A at beginning'); 
console.debug(a, 'B at beginning'); 
a.init(5); 
b.init(2); 
console.log('A: ' + a.status()); // return 2 (wtf!) 
console.log('B: ' + b.status()); // return 2` 

哪裏錯了嗎? 我以爲我的代碼會返回給我不是2值,但是5.

是什麼原因?

+0

我認爲你必須使用* var a = new mycompany.mymodule *。否則它只是反駁對象。 –

回答

2

ab是完全相同的對象。

var a = mycompany.mymodule; 
var b = mycompany.mymodule; 

你想要做的是創建兩個具有相同原型的不同對象。類似這樣的東西:

mycompany.mymodule = (function() { 
    var my = function() {}; 
    my.prototype.init = function (value) { 
    _setCount(value); 
    }; 
    my.prototype.incrementCount = ... 
    // ... 

    return my; 
}()); 

a = new mycompany.mymodule(); 
b = new mycompany.mymodule(); 
a.init(5); 
b.init(2); 

欲瞭解更多信息,研究「JavaScript的原型繼承」

1

在JavaScript中,對象是通過引用傳遞的,不可複製的。

爲了進一步解釋,這裏是你的代碼的簡化版本:

var pkg = (function() { 
    var x = {}; 
    return x; 
}()); 

var a = pkg; 
var b = pkg; 

不創建兩個單獨的對象,但只引用對象的指向由pkg來自abab完全一樣。

a === b // true 

這意味着調用方法上a你最終做同樣以b(它指向同一個對象 - x。)

你不想使用模塊模式這。你想要通常的構造函數+原型。

function Pkg() { 
    this.count = 0; 
}; 
Pkg.prototype.init = function (count) { this.count = count; }; 

var a = new Pkg(); 
var b = new Pkg(); 

a === b // false 

a.init(2); 
a.count === 2 // true 
b.count === 2 // false 
+0

謝謝!我可以計算一個私有變量嗎?和其他私人功能? – Matte

+1

爲什麼? JS中的私有意味着「不要觸及那個」,我們通過在變量名稱前面或後面使用下劃線來表示信號。如果你堅持,你可以使用'function Pkg(){this.count = 0; this.init = function(){...}; }變量'count'只對構造函數和方法'init'可見。 –

0

Here是一個很好的閱讀模塊模式。