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 相关文章推荐
Gird组件 Part-3:范例RSSFeed Viewer
Mar 10 Javascript
jQuery中的val()示例应用
Feb 26 Javascript
js简单工厂模式用法实例
Jun 30 Javascript
基于jquery实现轮播焦点图插件
Mar 31 Javascript
浅谈js中对象的使用
Aug 11 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
Sep 14 Javascript
JS绘制微信小程序画布时钟
Dec 24 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
Apr 13 Javascript
JavaScript字符串检索字符的方法
Jun 23 Javascript
Angular 容器部署的方法
Apr 17 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
May 23 Javascript
angularjs $http调用接口的方式详解
Aug 13 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 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
使用dump函数,给php加断点测试
2013/06/25 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
解析JSON对象与字符串之间的相互转换
2013/12/18 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
详解AngularJS2 Http服务
2017/06/26 Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
2017/11/27 Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
2020/08/11 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
python读取注册表中值的方法
2013/04/08 Python
python中 ? : 三元表达式的使用介绍
2013/10/09 Python
python处理文本文件并生成指定格式的文件
2014/07/31 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
详解flask表单提交的两种方式
2018/07/21 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
标准导师推荐信(医学类)
2013/10/28 职场文书
《灯光》教学反思
2014/02/08 职场文书
《长城》教学反思
2014/02/14 职场文书
作文批改评语大全
2014/04/23 职场文书
党支部换届选举方案
2014/05/08 职场文书
高中教师考核方案
2014/05/18 职场文书
薪资证明范本
2015/06/19 职场文书
公司出差管理制度范本
2015/08/05 职场文书
保外就医申请书范文
2015/08/06 职场文书
中学生运动会广播稿
2015/08/19 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL