JavaScript命名空间

目录

一、概念

二、嵌套命名空间

三、小结


一、概念

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

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

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

       那么JavaScript中该如何解决这个问题呢?我们可以通过一些特殊手段来模拟命名空间的概念。

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

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库来整理代码结构。

 

作者:ifcode
链接:https://www.jianshu.com/p/fbf5e6e77ebb

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值