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 offsetX与layerX区别
Mar 12 Javascript
JavaScript中__proto__与prototype的关系深入理解
Dec 04 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
Jun 26 Javascript
JavaScript数组去重的3种方法和代码实例
Jul 01 Javascript
js文字横向滚动特效
Nov 11 Javascript
EasyUI布局 高度自适应
Jun 04 Javascript
JS实现JSON.stringify的实例代码讲解
Feb 07 Javascript
深入浅析javascript继承体系
Oct 23 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
Dec 19 Javascript
Vue一个案例引发的递归组件的使用详解
Nov 15 Javascript
vue下载excel的实现代码后台用post方法
May 10 Javascript
OpenLayer3自定义测量控件MeasureTool
Sep 28 Javascript
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模块memcache和memcached区别分析
2011/06/14 PHP
PHP 第二节 数据类型之数组
2012/04/28 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
JS中showModalDialog 的使用解析
2013/04/17 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
js实现基于正则表达式的轻量提示插件
2015/08/29 Javascript
Javascript原型链的原理详解
2016/01/05 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
介绍Python中几个常用的类方法
2015/04/08 Python
python使用nntp读取新闻组内容的方法
2015/05/08 Python
Python三级菜单的实例
2017/09/13 Python
详解Python如何生成词云的方法
2018/06/01 Python
Linux 修改Python命令的方法示例
2018/12/03 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
K最近邻算法(KNN)---sklearn+python实现方式
2020/02/24 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
python 实现单例模式的5种方法
2020/09/23 Python
Django如何继承AbstractUser扩展字段
2020/11/27 Python
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
文明学生事迹材料
2014/01/29 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
冬季施工防火方案
2014/05/17 职场文书
本科生就业推荐信
2014/05/19 职场文书