• JavaScript命名空间的理解与实现


      命名空间有效防止函数名/类名和其他人的冲突,在使用多个第三方框架或类库的时候,一旦冲突,唯一能作的就是放弃其中一个。
    从事Web开发不可避免要接触JavaScript,目前最新版本的JavaScript还是不支持命名空间,所以命名冲突的问题凸显无疑,想象一下你引用了两个js文件,却发现由于命名问题导致你不得不放弃其中一个,从而导致多写了许多代码,无疑是十分令人沮丧的。在JavaScript新版本引入命名空间概念之前,发扬自立更生精神和创造性是我们程序员的基本义务;
      实现前提:与java、C#、C、C++等语言不同,JavaScript中的类并不是对象的定义,事实上JavaScript中并不存在真正的类,这里的类实际上是用函数模拟实现的,而JavaScript中的函数实际上是一个对象,因此在JavaScript中:一个类就是一个对象。这和传统概念概念极为不同,在JavaScript中,创建某个类的实例实际上就是将类(=对象,记住)复制了一份。看到这里,有点设计模式概念的应该就可以看出来了,在JavaScript中,类机制使用了原型(prototype)模式。 
      实现原理:既然看清楚了类的本质,那么问题就简单了,如果将GEA项目组所有JS类和函数作为属性放在名为GEA的对象里面,然后将GEA对象以属性的方式放在名为Grandsoft对象里面不就可以达到我们的目的,比如Grandsoft.GEA.Person实际上是在Grandsoft对象的属性GEA(也是一个对象)中的类Person(还是一个对象), 分析如下:

    // 编写一个namespace函数,要求此函数能够实现多层命名空间的嵌套
    // 声明一个全局对象Namespace,用来注册命名空间
    var Namespace = {};
    // 全局对象仅仅存在register函数,参数为名称空间全路径,如"Grandsoft.GEA"
    Namespace.register = function(fullPath) {
        // 将命名空间切成N部分, 比如Grandsoft、GEA等
        var sArray = fullPath.split('.');
        var sEval = "";
        var str = "";
        for (var i = 0; i < sArray.length; i++) {
            if (i != 0) str += ".";
            str += sArray[i];
            //依次创建构造命名空间对象(假如不存在的话)的语句,比如先创建Grandsoft,然后创建Grandsoft.GEA,依次下去
            sEval += "if (typeof(" + str + ") == 'undefined') " + str + " = new Object();"
        }
        if (sEval != "") eval(sEval);
    };
    // 上面就是在JavaScript中模拟命名空间机制的完整实现,使用方式如下: 
    // 注册命名空间Grandsoft.GEA, Grandsoft.GCM
    Namespace.register("Grandsoft.GEA");
    Namespace.register("Grandsoft.GCM"); 
    // 在Grandsoft.GEA命名空间里面声明类Person
    Grandsoft.GEA.Person = function(name, age)
    {
        this.name = name;
        this.age = age;
    } 
    // 给类Person添加一个公共方法show()
    Grandsoft.GEA.Person.prototype.show = function()
    {
        alert(this.name + " is " + this.age + " years old!");
    } 
    // 演示如何使用类Person
    var p = new Grandsoft.GEA.Person("Liuzhuo", 25);
    p.show();

    ok!到此结束!

  • 相关阅读:
    有哪些命令行的软件堪称神器?
    [置顶] 《技术大牛养成指南》
    Java 8 集合不完全一览
    [置顶] tcpflow 抓包
    被遗忘的 Logrotate
    [置顶] Every Programmer Should Know These Latency Numbers
    安装 Ubuntu 14.04 之后要做的一些事
    windows.h系统函数
    《葡萄源》
    在 Visual Studio 中创建一个简单的 C# 控制台应用程序
  • 原文地址:https://www.cnblogs.com/Iona/p/4733807.html
Copyright © 2020-2023  润新知