8 javascript closures new-operator module-pattern
我得到了模块模式的基础知识,并使用了一个闭包来允许私有成员,但是我不能完全接受为什么下面的代码会做它的作用:
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();
Run Code Online (Sandbox Code Playgroud)
控制台输出是
0
1
1
Run Code Online (Sandbox Code Playgroud)
因此,故意在new
此处省略关键字,第一个调用设置myCalc
为Calculator对象.它以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();
Run Code Online (Sandbox Code Playgroud)
然后输出是:
0
1
0
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5372 次 |
最近记录: |