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插入节点appendChild insertBefore使用方法
Jul 04 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
Sep 06 Javascript
Js的Array数组对象详解
Feb 22 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
May 10 Javascript
JS使用onerror捕获异常示例
Aug 03 Javascript
p5.js入门教程之鼠标交互的示例
Mar 16 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
May 05 Javascript
判断“命令按钮”是否被鼠标单击详解
Jul 31 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
Apr 28 Javascript
JavaScript实现HSL拾色器
May 21 Javascript
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 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静态页面实例代码
2008/08/31 PHP
网页游戏开发入门教程二(游戏模式+系统)
2009/11/02 PHP
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
微信小程序 Buffer缓冲区的详解
2017/07/06 Javascript
详释JavaScript执行环境与执行栈
2019/04/02 Javascript
在Express中提供静态文件的实现方法
2019/10/17 Javascript
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
python的常见命令注入威胁
2013/02/18 Python
python实现图像识别功能
2018/01/29 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
django中url映射规则和服务端响应顺序的实现
2020/04/02 Python
Keras loss函数剖析
2020/07/06 Python
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
分别介绍一下Session Bean和Entity Bean
2015/03/13 面试题
思想政治自我鉴定
2013/10/06 职场文书
《在大海中永生》教学反思
2014/02/24 职场文书
资金主管岗位职责范本
2014/03/04 职场文书
暑期培训随笔感言
2014/03/10 职场文书
2014最新实习证明模板
2014/10/02 职场文书
2015年审计人员工作总结
2015/05/26 职场文书
欢迎新生标语2015
2015/07/16 职场文书
Python常遇到的错误和异常
2021/11/02 Python