我了解了模块模式的基础知识以及它使用闭包来允许私有(private)成员,但我无法完全理解为什么下面的代码会执行它的操作:
var Calculator = function() {
var priv = 0;
return {
changePriv: function() { priv++;},
printPriv: function() { console.log(priv);}
}
}
var myCalc = Calculator();
myCalc.printPriv();
myCalc.changePriv();
myCalc.printPriv();
var myOtherCalc = Calculator();
myCalc.printPriv();
控制台输出是
0
1
1
因此这里有意省略了 new
关键字,第一次调用将 myCalc
设置为计算器对象。它以 priv
值 0 开始,递增,然后打印出其新的 priv
值 1。
但是 a) 为什么对 Calculator()
的下一次调用最终会返回对 SAME 对象的引用(如第二个“1”所示)?我知道我可以在这里使用 new
并避免这种情况,但不明白为什么我必须这样做。这个函数不是使用对象字面量语法来本质上创建一个新对象然后返回它吗?
b) 因为它似乎确实使用了相同的函数堆栈空间(在 JS 中,这甚至是正确的思考方式吗?),为什么它不将进程中的 priv
变量清零在返回对同一对象的引用之前?
编辑:纠正草率/愚蠢的错误(感谢 scessor),即使不使用 new
关键字,它现在也会输出一个新的/不同的计算器对象。这样就清除了 a) 和 b)。我由此产生的问题是“在模块模式构造函数的调用中是否使用 new
是否重要。答案是,我想这无关紧要(?)。(约瑟夫: 参见 http://jsfiddle.net/MvMvy/5/ ...instanceof 运算符根本不适用于模块模式。)
最佳答案
你不输出另一个计算器 myOtherCalc
:如果你想比较它们,将第三个 myCalc.printPriv();
替换为:
myOtherCalc.printPriv();
那么输出是:
0
1
0
关于Javascript 模块模式和 new 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10203560/