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 从if else 到 switch case 再到抽象
Jul 17 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
Jul 25 Javascript
js函数获取html中className所在的内容并去除标签
Sep 08 Javascript
javascript中声明函数的方法及调用函数的返回值
Jul 22 Javascript
javaScript的函数对象的声明详解
Feb 06 Javascript
简单实现jquery焦点图
Dec 12 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
Jan 03 Javascript
Angular6封装http请求的步骤详解
Aug 13 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
Dec 02 Javascript
React中使用UMEditor的方法示例
Dec 27 Javascript
微信小程序 bindtap 传参的实例代码
Feb 21 Javascript
JS判断数组四种实现方法详解
Jun 29 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实现简单洗牌算法
2013/06/18 PHP
使用php 获取时间今天明天昨天时间戳的详解
2013/06/20 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
JS简单操作select和dropdownlist实例
2014/11/26 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
2016/08/01 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
对Angular中单向数据流的深入理解
2018/03/31 Javascript
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
实例讲解JS中pop使用方法
2019/01/27 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
python回调函数的使用方法
2014/01/23 Python
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
pip install urllib2不能安装的解决方法
2018/06/12 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
Java如何读取CLOB字段
2013/10/10 面试题
中专毕业自我鉴定
2013/10/16 职场文书
装修致歉信
2014/01/15 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
新课培训心得体会
2014/09/03 职场文书
学生保证书
2015/01/16 职场文书
工作表扬信范文
2015/01/17 职场文书
php去除deprecated的实例方法
2021/11/17 PHP