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 21 Javascript
一步一步教你写一个jQuery的插件教程(Plugin)
Sep 03 Javascript
js实现快速分享功能(你的文章分享工具)
Jun 25 Javascript
JavaScript对象的property属性详解
Apr 01 Javascript
express的中间件basicAuth详解
Dec 04 Javascript
分享网页检测摇一摇实例代码
Jan 14 Javascript
javascript实现数字倒计时特效
Mar 30 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
Jun 13 Javascript
详解AngularJs中$resource和restfu服务端数据交互
Sep 21 Javascript
利用js给datalist或select动态添加option选项的方法
Jan 25 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
Aug 06 Javascript
JS class语法糖的深入剖析
Jul 07 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读取远程gzip压缩网页的方法
2014/12/29 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
php实现数据库的增删改查
2017/02/26 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
jQuery UI Bootstrap是什么?
2016/06/17 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
angular分页指令操作
2017/01/09 Javascript
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
2017/03/10 Javascript
基于JSON数据格式详解
2017/08/31 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
[07:52]2014DOTA2 TI逗比武士游V社解说背后的故事
2014/07/10 DOTA
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
pandas分别写入excel的不同sheet方法
2018/12/11 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
基于Python把网站域名解析成ip地址
2020/05/25 Python
Idea安装python显示无SDK问题解决方案
2020/08/12 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
2020/08/31 Python
Python类成员继承重写的实现
2020/09/16 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
大学校园毕业自我鉴定
2014/01/15 职场文书
环境日宣传活动总结
2014/07/09 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
表扬稿表扬信的格式及范文
2019/06/24 职场文书
PL350与SW11的比较
2021/04/22 无线电