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父窗口控制只弹出一个子窗口
Apr 10 Javascript
javascript控制frame,iframe的src属性代码
Dec 31 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
Sep 02 Javascript
jquery mobile的触控点击事件会多次触发问题的解决方法
May 08 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
Aug 21 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
Sep 26 Javascript
bootstrap网格系统使用方法解析
Jan 13 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
Apr 13 Javascript
浅谈react 同构之样式直出
Nov 07 Javascript
angularjs使用div模拟textarea文本框的方法
Oct 02 Javascript
Antd中单个DatePicker限定时间输入范围操作
Oct 29 Javascript
JavaScript实现点击切换验证码及校验
Jan 10 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
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
2015/03/26 PHP
是 WordPress 让 PHP 更流行了 而不是框架
2016/02/03 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
PHP中isset、empty的用法与区别示例详解
2020/11/05 PHP
js常用函数 不错
2006/09/08 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
三种检测iPhone/iPad设备方向的方法
2014/04/23 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
jQuery简单入门示例之用户校验demo示例
2016/07/09 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
Vue.js项目部署到服务器的详细步骤
2017/07/17 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
新手快速入门JavaScript装饰者模式与AOP
2019/06/24 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
python列表去重的二种方法
2014/02/14 Python
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
Python数据结构之翻转链表
2017/02/25 Python
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
Python中捕获键盘的方式详解
2019/03/28 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
Dune London官网:英国著名奢华鞋履品牌
2017/11/30 全球购物
Bibloo荷兰:女士、男士和儿童的服装、鞋子和配饰
2019/02/25 全球购物
静态成员和非静态成员的区别
2012/05/12 面试题
小学生学习感言
2014/03/10 职场文书
学生会主席演讲稿
2014/04/25 职场文书
大学生军训自我鉴定范文
2014/09/18 职场文书
民主评议党员自我评价材料
2014/09/18 职场文书
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android