簡體   English   中英

Javascript和模塊模式

[英]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。

什么原因?

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原型繼承”

在JavaScript中,對象是通過引用傳遞的,而不是復制的。

為了進一步說明,這是代碼的簡化版本:

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

var a = pkg;
var b = pkg;

您無需創建兩個單獨的對象,而只能從ab引用pkg指向的對象。 ab完全相同。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM