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 相关文章推荐
JS操作iframe里的dom(实例讲解)
Jan 29 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
Jun 27 Javascript
jquery左右全屏大尺寸多图滑动效果代码分享
Aug 28 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
Jul 08 Javascript
jQuery选择器总结之常用元素查找方法
Aug 04 Javascript
分分钟学会vue中vuex的应用(入门教程)
Sep 14 Javascript
AngularJS动态添加数据并删除的实例
Feb 27 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
Aug 28 Javascript
详解如何用typescript开发koa2的二三事
Nov 13 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
May 06 Javascript
通过实例解析javascript Date对象属性及方法
Nov 04 Javascript
jQuery实现动态操作table行
Nov 23 jQuery
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 文件状态缓存带来的问题
2008/12/14 PHP
php图片加中文水印实现代码分享
2012/10/31 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
php二维码生成
2015/10/19 PHP
windows平台中配置nginx+php环境
2015/12/06 PHP
javascript 动态加载 css 方法总结
2009/07/11 Javascript
js的一些常用方法小结
2011/06/29 Javascript
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
搭建pomelo 开发环境
2014/06/24 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
微信小程序 wxapp画布 canvas详细介绍
2016/10/31 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
2017/07/20 Javascript
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
2017/12/27 Javascript
详解vue组件基础
2018/05/04 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
[03:57]2016完美“圣”典风云人物:rOtk专访
2016/12/09 DOTA
gearman的安装启动及python API使用实例
2014/07/08 Python
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
Python中几种导入模块的方式总结
2017/04/27 Python
python中解析json格式文件的方法示例
2017/05/03 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
Python求均值,方差,标准差的实例
2019/06/29 Python
Python如何脚本过滤文件中的注释
2020/05/27 Python
PHP基于phpqrcode类库生成二维码过程解析
2020/05/28 Python
使用OpenCV实现道路车辆计数的使用方法
2020/07/15 Python
香港太阳眼镜网上商店:SmartBuyGlasses香港
2016/07/22 全球购物
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
在家更换处方镜片:Lensabl
2019/05/01 全球购物
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
环境卫生倡议书
2014/08/29 职场文书