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 相关文章推荐
JQuery中根据属性或属性值获得元素(6种情况获取方法)
Jan 17 Javascript
jquery自定义函数的多种方法
Jan 09 Javascript
用js判断输入是否为中文的函数
Mar 10 Javascript
JQuery显示、隐藏div的几种方法简明总结
Apr 16 Javascript
JavaScript实战之菜单特效
Aug 16 Javascript
JavaScript自定义分页样式
Jan 17 Javascript
vuejs事件中心管理组件间的通信详解
Aug 09 Javascript
mpvue跳转页面及注意事项
Aug 03 Javascript
详解Bootstrap 学习(一)入门
Apr 12 Javascript
通过jQuery学习js类型判断的技巧
May 27 jQuery
微信小程序 button样式设置为图片的方法
Jun 19 Javascript
如何利用javascript接收json信息并进行处理
Aug 06 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
15种PHP Encoder的比较
2007/03/06 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
WordPress JQuery处理沙发头像
2009/06/22 Javascript
jquery ready函数源代码研究
2009/12/06 Javascript
使用JS 清空File控件的路径值
2013/07/08 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
React操作真实DOM实现动态吸底部的示例
2017/10/23 Javascript
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
2018/08/24 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
Angular刷新当前页面的实现方法
2018/11/21 Javascript
React优化子组件render的使用
2019/05/12 Javascript
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
python+mysql实现学生信息查询系统
2019/02/21 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
Django中的AutoField字段使用
2020/05/18 Python
Python 发送邮件方法总结
2020/08/10 Python
Python中实现一行拆多行和多行并一行的示例代码
2020/09/06 Python
python中_del_还原数据的方法
2020/12/09 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
华润集团网上药店:健一网
2016/09/19 全球购物
联想香港官方网站及网店:Lenovo香港
2018/04/13 全球购物
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
How TDD works
2012/09/30 面试题
奶茶专卖店创业计划书
2014/01/18 职场文书
农民工工资支付承诺函
2014/03/31 职场文书
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫