JavaScript创建命名空间(namespace)的最简实现


Posted in Javascript onDecember 11, 2007

最近看Ext源代码,看到了其实现命名空间函数的实现方法:

Ext NameSpace实现代码: 
      

  namespace : function(){  

            var a=arguments, o=null, i, j, d, rt;  

            for (i=0; i<a.length; ++i) {  

                d=a[i].split(".");  

                rt = d[0];  

                eval('if (typeof ' + rt + ' == "undefined"){' + rt + ' = {};} o = ' + rt + ';');  

                for (j=1; j<d.length; ++j) {  

                    o[d[j]]=o[d[j]] || {};  

                    o=o[d[j]];  

                }  

            }  

        } 

鄙人喜好最简编程(这很多时候并不是一个好习惯,写的越简单程序一般越难理解),于是就想用更短的方式解决这个问题。
尝试了将近半个小时写下了下面的实现,基本该考虑的情况都考虑,至少不会覆盖页面已经存在的函数。

实现代码如下:

function namespace(ns){  

    if(typeof(ns)!="string")return;  

    ns=ns.split(".");  

    var o,ni;  

    for(var i=0,len=ns.length;i<len,ni=ns[i];i++){  

       try{o=(o?(o[ni]=o[ni]||{}):(eval(ni+"="+ni+"||{}")))}catch(e){o=eval(ni+"={}")}  

    }  

} 

你可以保存以下代码进行测试:

测试代码:

<script type="text/javascript">  

  <!--  

    function namespace(ns){  

        if(typeof(ns)!="string")return;  

        ns=ns.split(".");  

        var o,ni;  

        for(var i=0,len=ns.length;i<len,ni=ns[i];i++){  

            try{o=(o?(o[ni]=o[ni]||{}):(eval(ni+"="+ni+"||{}")))}catch(e){o=eval(ni+"={}")}  

        }  

    }  

    function a(){return 5}  

    namespace("a.b");  

    alert(a);  

    alert(a.b)  

    namespace("test.test.abc")  

    test.test.abc.func1=function(){  

        alert('func1 run')  

    }  

    alert(test.test)  

    test.test.abc.func1();  

  //-->  

</script>
Javascript 相关文章推荐
把字符串按照特定的字母顺序进行排序的js代码
Jan 28 Javascript
js实现iframe跨页面调用函数的方法
Dec 13 Javascript
Javascript实现div的toggle效果实例分析
Jun 09 Javascript
Javascript实现的简单右键菜单类
Sep 23 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
Mar 18 Javascript
JavaScript中ES6 Babel正确安装过程
Jul 18 Javascript
最常见的左侧分类菜单栏jQuery实现代码
Nov 28 Javascript
AngularJS路由实现页面跳转实例
Mar 03 Javascript
使用JQ完成表格隔行换色的简单实例
Aug 25 Javascript
详解在网页上通过JS实现文本的语音朗读
Mar 28 Javascript
原生js实现分页效果
Sep 23 Javascript
vue项目proxyTable配置和部署服务器
Apr 14 Vue.js
js模拟实现Array的sort方法
Dec 11 #Javascript
看了就知道什么是JSON
Dec 09 #Javascript
javascript while语句和do while语句的区别分析
Dec 08 #Javascript
js中将多个语句写成一个语句的两种方法小结
Dec 08 #Javascript
JavaScript开发时的五个注意事项
Dec 08 #Javascript
JS的递增/递减运算符和带操作的赋值运算符的等价式
Dec 08 #Javascript
javascript数组使用调用方法汇总
Dec 08 #Javascript
You might like
小偷PHP+Html+缓存
2006/12/20 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
Js base64 加密解密介绍
2013/10/11 Javascript
jQuery实现简单的间隔向上滚动效果
2015/03/09 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
Javascript HTML5 Canvas实现的一个画板
2020/04/12 Javascript
深入理解jQuery.data() 的实现方式
2016/11/30 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
AngularJS实现的回到顶部指令功能实例
2017/05/17 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
vue-lazyload使用总结(推荐)
2018/11/01 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
2019/06/10 Javascript
解决vue自定义指令导致的内存泄漏问题
2020/08/04 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
Python中的装饰器用法详解
2015/01/14 Python
深入解答关于Python的11道基本面试题
2017/04/01 Python
python创建文件时去掉非法字符的方法
2018/10/31 Python
浅谈Python 列表字典赋值的陷阱
2019/01/20 Python
python3人脸识别的两种方法
2019/04/25 Python
python属于软件吗
2020/06/18 Python
详解Python流程控制语句
2020/10/28 Python
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
美国领先的男士和女士内衣购物网站:Freshpair
2019/02/25 全球购物
申请任职学生会干部自荐书范文
2014/02/13 职场文书
我爱家乡演讲稿
2014/09/12 职场文书
工程合作意向书范本
2015/05/09 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
MySQL优化之慢日志查询
2022/06/10 MySQL