我正在从这个 url 阅读 javascript Modular patternhttp://viralpatel.net/blogs/javascript-module-pattern/
和
http://www.codeproject.com/Articles/247241/Javascript-Module-Pattern
我的脑海中出现了一些混乱。所以在这里我把东西放在我感到困惑的地方。请帮我理解所有。
问题 1
请参阅下面的代码。使用 var 关键字在模块中声明的所有私有变量和函数。这里的 pub 对象也用 var 关键字声明。这意味着酒吧是私人的。因此,当 pub 是私有的,那么人们如何从外部调用 pub 相关函数,如下面的代码
调用语法
CalcModule.add(2,10);
CalcModule.add(5,15);
CalcModule = (function(){
var pub = {};
var mem = new Array(); //private variable
var storeInMemory = function(val) { //private function
mem.push(val);
};
pub.add = function(a, b) {
var result = a + b;
storeInMemory(result); //call to private function
return result;
};
pub.sub = function(a, b) {
var result = a - b;
storeInMemory(result); //call to private function
return result;
};
pub.retrieveFromMemory = function() {
return mem.pop();
};
return pub;
})();
CalcModule.add(2,10);
CalcModule.add(5,15);
console.log(CalcModule.retrieveFromMemory()); //outputs 20
console.log(CalcModule.retrieveFromMemory()); //outputs 12
问题2
跨不同 JS 文件分离模块:增强
文件1.js
var CalcModule = (function($, pub){
//jQuery will still be available via $
var mem = new Array(); //private variable
pub.storeInMemory = function(val){
mem.push(val);
};
pub.retrieveFromMemory = function(){
return mem.pop();
};
return pub;
})(jQuery, CalcModule || {});
文件2.js
var CalcModule = (function($, pub){
//jQuery will still be available via $
pub.add = function(a,b){
var result = a + b;
pub.storeInMemory(result);
return result;
};
pub.sub = function(a,b){
var result = a - b;
pub.storeInMemory(result);
return result;
};
return pub;
}(jQuery, CalcModule || {}));
看到这个function($, pub)
语法。为什么有美元符号以及为什么 pub 需要经过那里。
问题 3
模块增强和子模块有什么区别?
问题 4
扩展现有模块模块
var Module1 = ( function (oldModule) {
var
//assigning oldmodule in to a local variable.
parent = oldModule;
//overriding the existing privileged method.
parent.privilegedMethod = function ( ){
//do something different by overriding the old method.
};
//private method accessing privileged method of parent module.
var privateMethod2 = function ( ) {
parent.privilegedMethod();//can access privileged method of Module
parent.publicMethod1(); //can access public method of Module
}
return {
newMethod : function ( ) {
///do something for this brand new module.
///use some functionality of parent module.
/// parent.privilegedMethod( );
}
};
} )(Module);//
模块对象是我想要扩展的现有模块。
任何人都可以理解上述代码如何扩展模块。只是通过这种语法(Module)
?
问题 5
如果我们在 5 个单独的 js 文件中编写模块,那么我们需要首先加载哪个文件。加载那些与模块相关的文件的顺序是什么?