框架设计中的主体函数

开发 架构
今天我们将谈到的是框架设计中的主体函数,包括主体控制函数和一些公用方法。包括 抛异常,打日志。

  JS 这个后产物种真的是让人纠结。现在的狠多人用JQUERY。但jquery对模块管理,依赖管理。已经需求加载。这些都无视了。GG的closure YAHOO!的 YUI没有哪个象他那样大胆的捆绑那么多的方法到一个整个文件而且又对函数不进行区块分离。以至于jquery天生就不能用到大项目。插件的缺失。(有人说jquery的插件多如牛毛,可是垃圾插件比牛毛还多。。你的系统不臃肿么???)很多人喜欢它是因为它的接口很好。一口多用。即可以设置,又可以读取,设置可以多手段。取出的又很实际。这样的接口现在很多的公司也开始模仿。我在想做的就是在JQUERY的接口思路上。用closure DOJO YUI这样的大型架构思路来做个自己的库。选择器这样的东西基本随便找个库都有吧。可是接口人们总是觉得不爽。我开始发现自己工作之后的时间不仅仅是可以用来打个DOTA-酱油。我们需要不断努力。一起做出非常棒的插件。看看jquery的成就。相信。我在我师傅的指导下。一定成功。

  下面是主体控制函数和一些公用方法。包括 抛异常,打日志。扩展,遍历。设置方法模型路径。获取模型(之前必须设置才可以获取不然抛异常)判断(数据)。

修正

  1. (function(window,undefined){  
  2. var_toString = {}.toString,  
  3. _is,  
  4. _writeScript,  
  5. _listUrl,  
  6. _scriptMap = {  
  7. method_url : {},//method --> url <method : url ><1 : 1 >  
  8. url_method : {},//url --> method <url : [method,method] ><1 : n >  
  9. visited : {},  
  10. writted : {},  
  11. wait_write:[]  
  12. },  
  13. _readyFnx = [],  
  14. alfred = function(){//自己单独使用也可以。象jquery  
  15. alfred.ready.apply(window,arguments);  
  16. };  
  17. //私有函数开始  
  18. _is = function(it,type){//复杂的可以自己进行设置。正则匹配。  
  19. returntype.test(_toString.call(it).toLowerCase());  
  20. };  
  21. _waitReady = function(){  
  22. //等结束。如果结束了。直接跳出循环。其实就是利用JS的这个特性。  
  23. if(document.readyState != "loaded" &&document.readyState != "complete")  
  24. {  
  25. vartime = setTimeout(arguments.callee,0);  
  26. return;  
  27. }  
  28. clearTimeout(time);  
  29. }  
  30. _checkReady = function(){  
  31. //处理参数  
  32. for(vari=0;i<arguments.length;i++)  
  33. {  
  34. _readyFnx.push(arguments[i]);  
  35. }  
  36. varcallback = _readyFnx.shift();  
  37. //支持高级事件的  
  38. if(document.addEventListener)  
  39. {  
  40. document.addEventListener("DOMContentLoaded",function(){  
  41. _waitReady();  
  42. document.removeEventListener("DOMContentLoaded",arguments.callee,false);  
  43. callback.apply(window,_readyFnx);  
  44. });  
  45. returnthis;  
  46. }  
  47. //支持事件则用事件处理 IE  
  48. if(document.attachEvent)  
  49. {  
  50. document.attachEvent( "onreadystatechange", function(){  
  51. _waitReady();  
  52. document.detachEvent( "onreadystatechange",arguments.callee);  
  53. callback.apply(window,_readyFnx);  
  54. });  
  55. returnthis;  
  56. }  
  57. //不支持的则看不在 iframe 下时候的特殊属性。看 JSCRIPT MSDN。  
  58. if(document.documentElement.doScroll &&window == window.top)  
  59. {  
  60. try 
  61. {  
  62. document.documentElement.doScroll("left","top");  
  63. }  
  64. catch(e)  
  65. {  
  66. setTimeout(arguments.callee, 0);  
  67. return;}  
  68. callback.apply(window,_readyFnx);  
  69. returnthis;  
  70. }  
  71. };  
  72. _listUrl = function(){  
  73. varl = _scriptMap.visited,i;  
  74. //对我们的URL 进行筛选 。主要防止多次添加访问过的依赖库。  
  75. for(i inl){  
  76. if(!_scriptMap.writted[i])  
  77. {  
  78. _scriptMap.wait_write.push(i);  
  79. }  
  80. }  
  81. _scriptMap.wait_write.reverse();  
  82. _writeScript();  
  83. };  
  84. _writeScript = function(){  
  85. //写入我们的JS 了。  
  86. varhead = document.getElementsByTagName("head").item(0),len = _scriptMap.wait_write.length;  
  87. for(vari;_scriptMap.wait_write.length&&(i=_scriptMap.wait_write.shift());) {  
  88. varscript = document.createElement("script"),  
  89. url = i || "";  
  90. script.setAttribute("async",true);//高级浏览器支持HTML5特性  
  91. script.setAttribute("type","text/javascript");  
  92. script.setAttribute("src",url);  
  93. head.appendChild(script);  
  94. _scriptMap.writted[url] = true;//这里无所谓,只要有这个URL就可以  
  95. };  
  96. };  
  97. alfred.extend = function(){  
  98. vardeep = false,  
  99. len,  
  100. options, name, src, copy, copyIsArray, clone,  
  101. target = arguments[0] || {},  
  102. i = 1;  
  103. len = arguments.length;  
  104. if(!len)  
  105. {  
  106. returnthis;  
  107. }  
  108. if(alfred.isBoolean(target))  
  109. {  
  110. deep = arguments[0];  
  111. to = arguments[1];  
  112. i = 2;  
  113. }  
  114. if(!(alfred.isObject(target) || alfred.isFunction(target))) {  
  115. target = {};  
  116. }  
  117. if(len = i)  
  118. {  
  119. target = this;  
  120. --i;  
  121. }  
  122. for(;i<len;i++) {  
  123. if((options=arguments[i])!==null)  
  124. {  
  125. for(name inoptions) {  
  126. copy = options[name];  
  127. src = target[name];  
  128. if(src){throw"Becareful : you are rewrite the "+_handle+"."+name+"!"}  
  129. if(copy===target) {continue}  
  130. if(deep &© &&(alfred.isObject(copy) || (copyIsArray = alfred.isArray(copy))))  
  131. {  
  132. if(copyIsArray)  
  133. {  
  134. copyIsArray = false;  
  135. clone = src &&alfred.isArray(src) ? src : [];  
  136. }  
  137. else 
  138. {  
  139. clone = src &&alfred.isObject(src) ? src : [];  
  140. }  
  141. target[ name ] = alfred.extend( deep, clone, copy );  
  142. }  
  143. elseif( copy !== undefined )  
  144. {  
  145. target[name] = copy;  
  146. }  
  147. }  
  148. }  
  149. }  
  150. };  
  151. alfred.isNumber = function(it){return_is(it,/^[object number]$/)};  
  152. alfred.isString = function(it){return_is(it,/^[object string]$/)};  
  153. alfred.isFunction = function(it){return_is(it,/^[object function]$/)};  
  154. alfred.isObject = function(it){return_is(it,/^[object object]$/)};  
  155. alfred.isArray = function(it){return_is(it,/^[object array]$/)};  
  156. alfred.isBoolean = function(it){returntypeofit ==='boolean'};  
  157. alfred.isDom = function(it){return_is(it,/^[object htmlw+]$/)};  
  158. alfred.extend({  
  159. author : "alfred",  
  160. version : 1.01,  
  161. global : window,  
  162. doc : window.document,  
  163. reset : function(it){alfred.global[it]=alfred;},  
  164. log : function()  
  165. {  
  166. if(window.console &&console.log)  
  167. {  
  168. returnconsole.log.apply(window,arguments)  
  169. }  
  170. },  
  171. error : function(name,value)  
  172. {  
  173. throw{"name":name,"message":value};  
  174. },  
  175. require : function(method)  
  176. {  
  177. varm2u = _scriptMap.method_url,  
  178. u2m = _scriptMap.url_method,  
  179. r;  
  180. if(!(m2u[method])){throw"Error : you need setMethod first"}  
  181. if(!_scriptMap.visited[m2u[method][0]] &&!_scriptMap.writted[m2u[method][0]]) {  
  182. //haven't be visited or write  
  183. _scriptMap.visited[m2u[method][0]] = true;  
  184. //use an beautiful code in here  
  185. for(; m2u[method][1].length &&(r=m2u[method][1].shift());)  
  186. {  
  187. alfred.require(r);  
  188. }  
  189. _listUrl();  
  190. }  
  191. },  
  192. setMethod : function(url,method,rely)  
  193. {  
  194. vari, method = alfred.isArray(method)? method:[method],  
  195. rely = alfred.isArray(rely)?rely:[rely];  
  196. if(url &&!_scriptMap.url_method[url]){  
  197. _scriptMap.url_method[url] = method;  
  198.  
  199. for(;method.length&&(i=method.shift());) {  
  200. _scriptMap.method_url[i] = {"0" : url, "1" : rely};  
  201. }  
  202. returnthis;  
  203. }  
  204. throw"Error : you are setMethod in an old method";  
  205. },  
  206. ready : function(){  
  207. _checkReady.apply(window,arguments);  
  208. },  
  209. each : function(arg,callback){  
  210. for(vari inarg){  
  211. if(arg[i])  
  212. {  
  213. callback.call(arg[i],i);  
  214. }  
  215. }  
  216. returnarg;  
  217. }  
  218. });  
  219. window.alfred = alfred;  
  220. })(window) 

   用的时候先引入这个文件。然后需要类似这样设置

 

  1. alfred.setMethod("basic.js",["alfred","alfred.global","alfred.doc","alfred.reset","alfred.log","alfred.isNumber",  
  2. "alfred.isFunction","alfred.isArray","alfred.isObject","alfred.isString","alfred.isBoolean",  
  3. "alfred.require","alfred.setMethod","alfred.extend"],[]); 

  这样设置了以后就可以告诉下面的JS 我已经提供了这些方法。随意alfred.require("alfred.reset"); 就可以把文件拉进页面注册好。

  页面内是这样的。

 

  1. <!DOCTYPE html> 
  2. <html> 
  3. <head> 
  4. <title> 
  5. </title> 
  6. </head> 
  7. <body> 
  8. <script type="text/javascript" src="base.js"></script> 
  9. <script type="text/javascript" src="deps.js"></script> 
  10. <script type="text/javascript"> 
  11. alfred.reset("$");  
  12. $.require("alfred.dom");  
  13. $(function(){  
  14. vara = $.dom("<div id='test' style='width:200px;height:200px;background:red;'> adf</div>");  
  15. $.dom("body").prepend(a);  
  16. })  
  17. </script> 
  18. </body> 
  19. </html> 

 

  alfred.reset 是为了方便自己设置方法名字。这样我们几乎可以象jquery一样使用了。

  alfred.reset("$");

  $.require("alfred.dom");

  $.dom("div a span:first-child").append("hello alfred");

  就 可以这样用了。。

  如果感觉这样不爽。欢迎各位朋友来交流下。我刚学JS 不是很久。所以技艺不高,研究不深。忘各位来指点下。互相提高。QQ:164864042

  -------无代码 ,生活不***。

  开始 到结束 只是那么个过程。结束了 就忘记吧。

原文链接:http://www.cnblogs.com/AlfredLee/archive/2012/01/17/base-js.html

【编辑推荐】

  1. 上网抢不到火车票,你该骂谁?
  2. 牛人分享网上订火车票的小技巧:Firefox+Firebug
  3. 大型JavaScript应用程序架构模式
  4. 京东今天还在用.NET架构的原因是什么?
  5. 系统架构师谈企业应用架构之服务层
责任编辑:彭凡 来源: 博客园
相关推荐

2011-04-22 09:26:57

MVC设计

2012-06-25 12:43:26

.NET框架

2020-07-30 10:35:32

Java反射框架设计

2012-06-25 09:28:42

.NET可逆框架

2016-03-23 11:05:58

Socket开发框架分析

2009-09-08 09:12:12

LINQ构建框架设计

2022-09-15 18:32:13

SPI模型框架

2021-02-23 08:18:04

Java 反射机制

2022-06-15 11:01:59

自定义SPIJava

2023-10-26 09:02:30

框架设计模式

2012-01-10 10:04:43

Node.js

2010-09-25 13:09:39

UISymbian

2022-04-03 15:44:55

Vue.js框架设计设计与实现

2022-10-10 09:11:12

互联网存储系统云计算

2013-09-09 10:48:24

iOS无线客户端框架设计

2013-09-03 09:35:48

无线客户端框架设计iOS

2013-09-03 09:55:42

iOS无线客户端框架设计

2017-04-12 23:33:38

DevOps平衡计分卡框架

2022-09-25 21:45:54

日志平台

2024-01-31 22:08:18

分布式重试框架
点赞
收藏

51CTO技术栈公众号