基于JavaScript 下namespace 功能的简单分析


Posted in Javascript onJuly 05, 2013

之前看到网易还是新浪还是什么什么网站来着,也是用类似这种东西的,当时对js只是九牛一毛的水平,当场被吓傻了。
但这次,我打算亲自分析下,以后在看到就不会迷茫了。

//调用例子:bradio.namespace("bradio.lang.array");
 //下面是百度编译后的源码,变量都是a,b,c,d...之后我会重新写一个规范点的。
 //好了,开始分析
 bradio.namespace = function () { //创建命名空间
     var a = arguments, //["bradio.lang.array"]
         b = null, //用于存放上一级对象
         c, d, e, f; //c是计数器,d是内层循环的计数器,e是拆分后命名空间数组,f是arguments参数长度
     c = 0;
     for (f = a.length; c < f; c++) {
         e = ("" + a[c]).split("."); //拆分命名空间,拆分后 ["bradio", "lang", "array"]
         b = bradio; //基础对象,基于这个对象进行命名空间的添加
         for (d = "bradio" == e[0] ? 1 : 0; d < e.length; d++) //如果第一个是bradio, 就第二个开始遍历 ["bradio","lang","array"]
             b[e[d]] = b[e[d]] || {}, b = b[e[d]]
             //其实相当于
             //b[e[d]] = b[e[d]] || {} //如果当前对象已经操作就用当前对象,不存在就赋值空对象
             //b = b[e[d]] //用字对象覆盖b,接下去的循环基于子对象添加命名空间
     }
     return b//返回最后一层对象
 };

下面是整理后的,能看懂的版本
//bradio.namespace("bradio.lang.array");
  bradio.namespace = function () { //创建命名空间
      var args = arguments,
          parent = null,
          arr, i, j, len;
      for (i=0, len = args.length; i < len; i++) {
          arr = ("" + args[i]).split(".");
          parent = bradio;
          for(j = "bradio" == arr[0] ? 1 : 0; j < arr.length; j++) {
              parent[ arr[j] ] = parent[ arr[j] ] || {};
              parent = parent[ arr[j] ];
          }
      }
      return parent;
  }

当然只是我的理解,如果哪里不是很对,还请各位大侠帮忙指出,以免误导了大家。
Javascript 相关文章推荐
Javascript中3种实现继承的方法和代码实例
Aug 12 Javascript
JS实现的5级联动Select下拉选择框实例
Aug 17 Javascript
Vue学习笔记进阶篇之函数化组件解析
Jul 21 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
Jul 27 Javascript
vue-lazyload图片延迟加载插件的实例讲解
Feb 09 Javascript
create-react-app修改为多页面支持的方法
May 17 Javascript
Cocos2d实现刮刮卡效果
Dec 20 Javascript
Vue核心概念Action的总结
Jan 18 Javascript
基于ts的动态接口数据配置的详解
Dec 18 Javascript
JS数组方法slice()用法实例分析
Jan 18 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
Aug 17 Javascript
React-vscode使用jsx语法的问题及解决方法
Jun 21 Javascript
javascript基础之查找元素的详细介绍(访问节点)
Jul 05 #Javascript
js文件缓存之版本管理详解
Jul 05 #Javascript
单击复制文字兼容各浏览器的完美解决方案
Jul 04 #Javascript
把input初始值不写value的具体实现方法
Jul 04 #Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
Jul 04 #Javascript
简单实用jquery版三级联动select示例
Jul 04 #Javascript
原生javascript和jquery判断浏览器版本等信息
Jul 04 #Javascript
You might like
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
PHP简单实现合并2个数字键数组值的方法
2017/05/30 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
2018/04/04 PHP
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
JS 去除Array中的null值示例代码
2013/11/20 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
python使用socket向客户端发送数据的方法
2015/04/29 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
PyQt5实现暗黑风格的计时器
2019/07/29 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
Django如何批量创建Model
2020/09/01 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
初中三好学生自我鉴定
2014/04/07 职场文书
关于学习的演讲稿
2014/05/10 职场文书
村班子对照检查材料
2014/08/18 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP