随着v8的推动,javascript增强的同时,交互模式也越来越重要。由于之前接触过python,对其中的__doc__功能颇有印象,因而决定在javascript中实现类似功能
功能:返回函数中没被变量赋值的字符串数组中的字符串,作为函数的文档。
原理:多亏了javascript的原型机制,在Function的prototype中添加一个__doc__()函数,这个函数通过toString得到函数代码,再利用正则表达式提取,返回出来需要显示的代码段。应为考虑到注释的影响,在开始首先会删掉注释,不过这也引来了一个问题:如果像是注释在字符串中依旧会被删除,不过注意下应该不是大问题。
使用方式:功能的使用很简单,首先在声明你自己的函数(假设是myFun)的时候在需要的地方加入["说明:","说明第一段","说明第二段"]可以加入多处,每一个字符串在输出时会输出一行。调用函数说明仅仅需要myFun.__doc__();就会返回说明字符串。很简单
考虑到javascript的语法,我觉得用一个不引用的字符列表比较好,毕竟不会影响到程序逻辑,对于性能影响也不大(发布前随便优化以下肯定没了),而且可以写的很好看。
Function.prototype.__doc__=function __doc__ (){ "use strict"; ["本函数用于查看自定义函数文档,返回文档中以[\"..文本内容..\"]中间包括的说明"]; ["文档说明本质为一个在函数中未被引用的仅包含字符串的数组,且可以有多个数组", "数组中的每一个元素,即一个字符串,代表一行说明。函数通过调用__doc__方法", "返回这些在数组中的说明。", " 想更一步了解本功能,可以尝试分别运行Function.__doc__.__doc__()和", " Function.__doc__.toString()比较其中内容。", "*注意:目前在文档存放数组中使用javascript注释标示会导致错误分割" ]; arguments:null; name:"__doc__"; var res="\n"; if(typeof(this)==="function"){ var getNoteReg=/(\/\/.*|\/\*.*?\*\/|\n|\r)/g; /* V下面没有这个空格,加上它是应为语法高亮的bug删掉这个空格就好 */ var getList=/\S\s*\ [\s*("|')(\\.|.)*?\1\s*(,\s*"(\\.|.)*?"|,\s*'(\\.|.)*?')*\s*/g; var list=this.toString().replace(getNoteReg,"").match(getList); if(list==null)return "尚未编写文档"; for(var i in list){ var opt=list[i].substr(0,1); if(opt != "=" && opt!= ":"){ try{ if(typeof(JSON)==="object" && typeof(JSON.parse)==="function"){ var date=JSON.parse(list[i].substr(1)); }else{ var date=eval(list[i].substr(1)); }for(var dateN in date)res+=date[dateN]+"\n"; }catch(e){ if(typeof(console)!="undefined" && typeof(console.debug)==="function") console.debug(e); else alert("error 解析失败"); } } }return res; }else return "error type!not a function"; }; |
您必须登录才能发表评论。