[英]Javascript and module pattern
我認為我不了解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。
什么原因?
a
和b
是完全相同的對象。
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原型繼承”
在JavaScript中,對象是通過引用傳遞的,而不是復制的。
為了進一步說明,這是代碼的簡化版本:
var pkg = (function () {
var x = {};
return x;
}());
var a = pkg;
var b = pkg;
您無需創建兩個單獨的對象,而只能從a
和b
引用pkg
指向的對象。 a
和b
完全相同。
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
這是有關模塊模式的很好的閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.