Javascript 模块模式和 new 关键字

标签 javascript closures new-operator module-pattern

我了解了模块模式的基础知识以及它使用闭包来允许私有(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/

相关文章:

javascript - 此页面上的脚本导致 ie 运行缓慢

javascript - 修改 Array.forEach 以自动将上下文设置为调用方

javascript - Var 和 new 之间的区别

c++ - 在存储可以用不同派生类型初始化的基类型成员变量时避免使用 new

c++ - 构造函数不会将使用 new 初始化的数组作为参数

javascript - 如何在 ID 属性中存储 HTML 标记?

javascript - 在 Wordpress 上添加平滑滚动条 JavaScript

javascript - 在 IE10 中保持占位符的焦点

javascript - 确定函数在闭包 javascript 中是如何被调用的

c++ - 我应该通过 const 引用传递一个 lambda。