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客户端脚本的设计和应用
Aug 21 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
Dec 30 Javascript
JS仿flash上传头像效果实现代码
Jul 18 Javascript
jquery插件orbit.js实现图片折叠轮换特效
Apr 14 Javascript
JavaScript学习笔记--常用的互动方法
Dec 07 Javascript
快速掌握jQuery插件开发
Jan 19 Javascript
angular实现表单验证及提交功能
Feb 01 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
Nov 21 Javascript
JS实现字符串中去除指定子字符串方法分析
May 17 Javascript
vue服务端渲染添加缓存的方法
Sep 18 Javascript
解决layui数据表格Date日期格式的回显Object的问题
Sep 19 Javascript
three.js着色器材质的内置变量示例详解
Aug 16 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
解析dedecms空间迁移步骤详解
2013/05/15 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
php下获取http状态的实现代码
2014/05/09 PHP
PHP 微信扫码支付源代码(推荐)
2016/11/03 PHP
20个非常棒的 jQuery 幻灯片插件和教程分享
2011/08/23 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
javascript常见数据验证插件大全
2015/08/03 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
2017/12/28 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
vue2.0 循环遍历加载不同图片的方法
2018/03/06 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
js删除数组中某几项的方法总结
2019/01/16 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
Python读写Excel文件方法介绍
2014/11/22 Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
2016/04/20 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
Django自定义分页效果
2017/06/27 Python
Python 隐藏输入密码时屏幕回显的实例
2019/02/19 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
如何在pycharm中安装第三方包
2020/10/27 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
Html5页面点击遮罩层背景关闭遮罩层
2020/11/30 HTML / CSS
卡塔尔航空官方网站:Qatar Airways
2017/02/08 全球购物
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
Linux内核产生并发的原因
2012/07/13 面试题
暑期实践思想汇报
2014/01/06 职场文书
外语系毕业生求职自荐信
2014/04/12 职场文书
公司管理建议书
2015/09/14 职场文书
2019年大学生学年自我鉴定!
2019/03/25 职场文书