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 相关文章推荐
EasyUI的treegrid组件动态加载数据问题的解决办法
Dec 11 Javascript
JavaScript 实现类的多种方法实例
May 01 Javascript
jQuery中innerWidth()方法用法实例
Jan 19 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
Jun 23 Javascript
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
Feb 27 Javascript
jQuery列表检索功能实现代码
Jul 17 jQuery
vue2.0 datepicker使用方法
Feb 04 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
Feb 10 Javascript
JS 音频可视化插件Wavesurfer.js的使用教程
Oct 31 Javascript
webpack中如何加载静态文件的方法步骤
May 18 Javascript
微信小程序实现日历小功能
Nov 18 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
Feb 26 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 反射机制实现动态代理的代码
2008/10/22 PHP
php数据结构与算法(PHP描述) 快速排序 quick sort
2012/06/21 PHP
PHP连接Access数据库的方法小结
2013/06/20 PHP
PHP实现简单的计算器
2020/08/28 PHP
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
javascript操作css属性
2013/12/30 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
2014/04/12 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
javascript简易画板开发
2020/04/12 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
2019/07/31 Javascript
使用Python装饰器在Django框架下去除冗余代码的教程
2015/04/16 Python
Django的session中对于用户验证的支持
2015/07/23 Python
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
python、Matlab求定积分的实现
2019/11/20 Python
Django密码存储策略分析
2020/01/09 Python
Python基于BeautifulSoup爬取京东商品信息
2020/06/01 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
HTML5在IE10、火狐下中文乱码问题的解决方法
2013/11/18 HTML / CSS
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
高级销售员求职信
2013/10/25 职场文书
村官学习十八大感想
2014/01/15 职场文书
计算机售后服务承诺书
2014/05/30 职场文书
计算机科学技术自荐信
2014/06/12 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
2014年新教师工作总结
2014/11/08 职场文书
新生入学欢迎词
2015/01/26 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang
MySQL update set 和 and的区别
2021/05/08 MySQL
公历12个月名称的由来
2022/04/12 杂记