创建模块的多个实例

nfp*_*lee 15 javascript module-pattern revealing-module-pattern

我以为我开始很好地理解JavaScript,但显然不是.让我用一个例子来解释我的问题.首先,我定义了以下模块:

var Test = function() {
    var counter = 0;

    function init() {
        alert(counter);
    }

    return {
        counter: counter,
        init: init
    }
};
Run Code Online (Sandbox Code Playgroud)

然后我创建了2个实例:

var test1 = new Test();
var test2 = new Test();
Run Code Online (Sandbox Code Playgroud)

现在我更新计数器变量(因为它是公共的)并做一些警报.到现在为止还挺好.

alert(test1.counter); // Alerts 0
test1.counter = 5;
alert(test2.counter); // Alerts 0
test2.counter = 10;
alert(test1.counter); // Alerts 5
Run Code Online (Sandbox Code Playgroud)

现在终于说出以下内容:

test1.init(); // Alerts 0
test2.init(); // Alerts 0
Run Code Online (Sandbox Code Playgroud)

这是我不明白的一点.为什么这个警报0?我认为第一个警报是5,第二个是10.

如果有人能解释上述内容如何起作用或指出我正确的方向,我将不胜感激.谢谢

Der*_*會功夫 13

它停留0是因为你没有更改里面的变量Test,你正在改变函数返回的对象.counter保持"私密",只有一个功能Test可以访问它.

var Test = function() {
    var counter= 0;

    function init() {
            alert(counter);
    }
    function changeNum(n){
        counter = n;            //add a function inside `Test` so that it can
    }                           //access the variable

    return {
        counter: counter,
        init: init,
        changeNum: changeNum
    }
};
Run Code Online (Sandbox Code Playgroud)

现在它将工作:http://jsfiddle.net/DerekL/pP284/

var test1 = new Test();
alert(test1.counter);           //0
test1.init();                   //0
test1.changeNum(5);
alert(test1.counter);           //5
test1.init();                   //5
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅JavaScript闭包.


Anv*_*aka 5

这就是发生的事情:

  1. init()函数对counter变量进行了闭包,该变量在Test scope中定义,并保存对它的引用.
  2. 从Test()函数返回创建了一个新对象,另一个变量counter设置为internal的值counter.
  3. counter通过设置test1.counter = X来更新"另一个" ,但init()仍保留对原始变量的引用.

这就是你看到旧价值的原因.