JS命名空间(namespace)

命名空间namespace(某些语言中叫package),是一个在静态语言中常见的概念。它可以帮助我们更好地整理代码,并可避免命名冲突。

举一个简单的例子,如果有两个人都叫小明,我们很难区分和引用这两个人。但如果我们在他们前面加上命名空间,比如:北京的小明和上海的小明,那么区分起来就容易的多了,也不会因为重名而找错人了。

遗憾的是,JS中并不提供原生的命名空间支持。在JS中创建的任何对象都默认是全局对象。在现代的大规模JS开发中,不采用命名空间会造成非常糟糕的命名方式,比如用前缀命名函数和变量,导致代码丑陋不可读。当引入第三方库后,更可能会发生命名覆盖的情况。

那么JS中该如何解决这个问题呢?你可以等ES6的到来,到那时我们就有native命名空间可用了。当下我们还需要一些特殊手段来模拟命名空间的概念。

简单地说,我们可以创建一个简单对象字面量来打包所有的相关函数和变量。这个简单对象字面量模拟了命名空间的作用。

var MYNAMESPACE = {
    person: function(name) {
        this.name = name;
        this.getName = function() {
            return this.name;
        }
    }
};

person对象被完整包含到MYNAMESPACE这个命名空间中了,使用方法也很简单:

var p = new MYNAMESPACE.person("ifcode");

p.getName();    // ifcode

如此一来,通过命名空间我们就可以声明多个person对象了。

嵌套命名空间

我们也可以用是嵌套命名空间,更详细的归类对象:

var MYNAMESPACE = {
    PEOPLE: {
        person: function(name) {
            this.name = name;
            this.getName = function() {
                return this.name;
            }
        }
    },
    PET: {
        dog: function(petName) {
            this.petName = petName;
            this.getPetName = function() {
                return this.petName;
            }
        }
    }
};

看起来这个模拟的命名空间不错,但这里还是有一个问题。我们这里使用的是一个全局对象,在添加这个“命名空间”的时候,我们有可能覆盖全局空间中的同名对象。因此我们需要在声明命名空间前进行检查,保证全局空间的安全:

var MYNAMESPACE = MYNAMESPACE || {};

若全局空间中已有同名对象,则不覆盖该对象;否则创建一个新的命名空间。采用了这个安全的命名空间后,声明的方法也需要略作改动:

var MYNAMESPACE = MYNAMESPACE || {};

MYNAMESPACE.person = function(name) {
    this.name = name;
};

MYNAMESPACE.person.prototype.getName = function() {
    return this.name;
};

// 使用方法
var p = new MYNAMESPACE.person("ifcode");
p.getName();        // ifcode

注意在定义命名空间构造函数时,需要将其定义在prototype上,否则新建的实例无法访问对象的方法。

小结

采用命名空间后,代码结构会更加清晰可读。若不想每次都手动构建命名空间,也可以采用类似requirejs这样的module pattern库来整理代码结构。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,202评论 25 708
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,827评论 2 17
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,760评论 18 399
  • 昨天家长会后心情郁闷,青春期的女儿不但成绩下滑,而且与同学关系也存在问题,我非常苦恼,平时家庭教育方面的书看的也不...
    田心远阅读 187评论 0 0
  • 花了很久的时间断断续续看完这本《致命的自负》,我觉得这实在是一本艰涩难懂的书。“有人看到光,有人看到的却是影。”即...
    爱吃香蕉的猴阅读 757评论 0 1