浅谈js命名空间管理

         在C# 和 Java里面咱们若是想使用哪个功能类就要引用相应的命名空间。编程

         如C#里面有个System.Web.UI库,咱们就要用using   System.Web.UI;,以后咱们就能够用到ScriptManager这个类了。dom

         js里面实际上是不纯在所谓的命名空间的,只是以对象字面量的方式展现出这种效果。模块化

         js实现以上的效果经过如下代码:函数

         var System={学习

                  Web:{spa

                      UI:{code

                           ScriptManager:{}对象

                     }blog

                }ip

        };

    这种方式感受比较麻烦,仍是习惯经过System.Web.UI这种方式来注册一个命名空间   NameSpace.Register("System.Web.UI"),咱们只须要动态的建立对象就能实现。

     动态建立对象咱们能够经过 两种方法:1.window 对象实现   2.eval实现。

     下面就介绍两种实现方式:

        1.window 对象实现 :

               咱们知道定义一个对象能够这样,window['System']={};  System['Web']={}   ;System.Web['UI']={};

               其实这样就简单了,咱们实现动态建立对象只须要拆分字符串建立对应的对象,代码以下:

         

var NameSpace = {
    Register: function () {
        // body...
        var arg = arguments[0];
        var arr = arg.split('.');
        var context = window;
        for (var i = 0; i < arr.length; i++) {
            var str = arr[i];
            if (!context[str]) {
                context[str] = {};
            }
            context = context[str];
        };
    }
}

     2.eval实现:

     

 var NameSpace = {
            Register: function () {
                // body...
                var arg = arguments[0];
                var arr = arg.split('.');
                var str = '';
                for (var i = 0; i < arr.length; i++) {
                    str = i == 0 ? arr[i] : (str + '.' + arr[i]);
                    var sval = "   if(typeof " + str + "=='undefined' ) { " + str + "= new Object(); } ";
                    eval(sval) ;
                };
            }
        }

   这种是经过动态执行js字符串的方式,实际上是将字符转换成代后执行而已,代码就没啥难度了。

   咱们就能够直接经过 NameSpace.Register("System.Web.UI")注册对象,而后  System.Web.UI.dom={   method:function(){}}这样扩展一些方法。

   扩展想法:既然对象已经建立出来了,我又有了个想法。我以为能够模仿模块化编程,进行进一步改造。能够扩展相似于如下的函数:

        define("dom.utility",  function(){   

         return {

               test :function(){    

               }

               }

        })

        或者  

        define("dom.utility",{  test :function(){ 

          })

     调用的时候咱们就直接用dom.utility.test()这种方式;

      实现这个define函数的思路:对象的属性拷贝,例如:将test属性加到dom.utility对象下面。

      你们能够本身先写一个试试看,能够把代码贴到评论里面方便你们交流学习,下一篇我会贴出源码。

相关文章
相关标签/搜索