View Code
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <title>JS中Module模式基本和高级用法.htm</title> 5 6 <script src="jquery-1.3.2.min.js" type="text/javascript"></script> 7 8 <script src="js/blogModule.js" type="text/javascript"></script> 9 </head> 10 <body> 11 <span>code:</span> 12 <input type="text" name="txteq" id="eq" /> 13 </body> 14 </html> 15 16 <script type="text/javascript" language="javascript"> 17 /*----基本用法----*/ 18 /*知识点*/ 19 /*(jQuery,YAHOO) 函数最后的这种写法是 函数的自执行 函数的参数就是这两个变量*/ 20 /*例1*/ 21 var Calculator = function(id) { 22 //这里可以声明私有成员 23 24 var eqCtl = document.getElementById(id); 25 return { 26 // 暴露公开的成员 27 add: function(x, y) { 28 var val = x + y; 29 eqCtl.value = val; 30 } 31 }; 32 }; 33 /*调用*/ 34 var id = "eq"; 35 var calculator = new Calculator(id); 36 calculator.add(2, 2); 37 /*引用全局变量*/ 38 (function($) { 39 // 这里,我们的代码就可以使用全局的jQuery对象了,YAHOO也是一样 40 } (jQuery)); 41 /*例2*/ 42 var blogModule = (function() { 43 var my = {}, privateName = "博客园"; 44 45 function privateAddTopic(data) { 46 //这里是内部处理代码 47 } 48 49 50 my.name = privateName; 51 my.AddTopic = function(data) { 52 privateAddTopic(data); 53 }; 54 my.text = ""; 55 my.passwold = ""; 56 my.email = ""; 57 58 59 return my; 60 } ()); 61 var data; 62 blogModule.AddTopic(data); 63 var name = blogModule.name; 64 var text = blogModule.text; 65 var passwold = blogModule.passwold; 66 var email = blogModule.email; 67 //==========解释=========================== 68 //以上声明了一个全局变量blogModule, 69 //并且带有5个可访问的属性:AddTopic(),name,text...... , 70 //其他函数都在匿名函数的闭包里 71 //保持私有状态,而且我们也可以很方便的将其他的全局变量传入 72 //======================================== 73 74 75 /*----高级用法----*/ 76 77 /*例3*/ 78 /*----紧耦合扩展----*/ 79 var blogModule = (function(my) { 80 var privateName = "博客园"; 81 my.AddPhto = function() { 82 //内部处理代码 83 84 alert(privateName); 85 }; 86 return my; 87 } (blogModule)); 88 /* 例4*/ 89 /*----松耦合扩展----*/ 90 var blogModule = (function(my) { 91 var privateName = "博客园"; 92 my.AddPhto = function() { 93 //内部处理代码 94 95 alert(privateName); 96 }; 97 return my; 98 } (blogModule || {})); 99 /*例3 例4对比结论*/ 100 //虽然松耦合扩展很牛叉了,但是可能也会存在一些限制, 101 //比如你没办法重写你的一些属性或者函数,也不能在初 102 //始化的时候就是用Module的属性。紧耦合扩展限制了加 103 //载顺序,但是提供了我们重载的机会 104 /*例5*/ 105 var blogModule = (function(my) { 106 var oldAddPhtoMethod = my.AddPhto; 107 my.AddPhto = function() { 108 //重载方法 依然可以通过oldAddPhtoMethod调用旧方法 109 }; 110 } (blogModule)); 111 112 /*克隆与继承*/ 113 var blogModule = (function(old) { 114 var my = {}, 115 key; 116 for (key in old) { 117 if (old.hasOwnProperty(key)) { 118 my[key] = old[key]; 119 120 } 121 } 122 var oldAddPhtoMethod = old.AddPhto; 123 my.AddPhto = function() { 124 alert(typeof my); 125 //克隆以后进行了重写,当然也可以调用旧的方法 126 }; 127 128 return my; 129 130 } (blogModule)); 131 var myblogmodule =blogModule(); 132 myblogmodule.AddPhto(); 133 134 </script>