0

私は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 値を返したと思いました。

どういう理由ですか?

4

3 に答える 3

2

abはまったく同じオブジェクトです。

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

やりたいことは、同じプロトタイプを持つ 2 つの異なるオブジェクトを作成することです。これに似たもの:

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 プロトタイプ継承」を調べてください。

于 2012-11-05T09:51:54.623 に答える
1

JavaScript では、オブジェクトは参照によって渡され、コピーされません。

さらに説明するために、コードの簡略版を次に示します。

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

var a = pkg;
var b = pkg;

2 つの別個のオブジェクトを作成するのではなく、とpkgの両方から が指すオブジェクトのみを参照します。とまったく同じです。abab

a === b // true

これは、メソッドを呼び出すと、a最終的に同じことを行うことを意味しますb(同じオブジェクト <code>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
于 2012-11-05T09:53:06.380 に答える