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 相关文章推荐
JavaScript 继承详解(一)
Jul 13 Javascript
javascript中定义类的方法详解
Feb 10 Javascript
CSS图片响应式 垂直水平居中
Aug 14 Javascript
使用JQuery实现智能表单验证功能
Mar 08 Javascript
AngularJS 入门教程之HTML DOM实例详解
Jul 28 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
Aug 02 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
Sep 20 Javascript
Angular2管道Pipe及自定义管道格式数据用法实例分析
Nov 29 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
Dec 15 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
May 29 Javascript
详解Vue3 Teleport 的实践及原理
Dec 02 Vue.js
vue实现无缝轮播效果(跑马灯)
May 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中使用array_filter()函数过滤空数组的实现代码
2014/08/19 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
2018/07/30 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
javascript 硬盘序列号+其它硬件信息
2008/12/23 Javascript
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
2015/02/05 Javascript
JQuery选择器、过滤器大整理
2015/05/26 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
2015/06/06 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
JavaScript实现Tab标签页切换的最简便方式(4种)
2020/06/28 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
python中类的一些方法分析
2014/09/25 Python
Python线程的两种编程方式
2015/04/14 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
DES加密解密算法之python实现版(图文并茂)
2018/12/06 Python
Pycharm配置远程调试的方法步骤
2018/12/17 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
详解selenium + chromedriver 被反爬的解决方法
2020/10/28 Python
东方电视购物:东方CJ
2016/10/12 全球购物
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
前台文员岗位职责
2013/12/28 职场文书
园林资料员岗位职责
2013/12/30 职场文书
村优秀党员事迹材料
2014/01/15 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
2014年资料员工作总结
2014/11/18 职场文书
社区安全温馨提示语
2015/07/14 职场文书
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技