您的位置:首页 > Web前端 > JavaScript

为您解惑:JavaScript命名空间的理解与实现........

2016-10-24 17:27 603 查看
命名空间:

JavaScript不像C#或Java,有专门的namespace和package语法支持,当JS复杂到一定程度,尤其是引用大量的第三方JS框架和类库之后,命名冲突就会成为一个严重的问题,因此使用JS自己的变通方式建立命名空间很重要。

1. 在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以先看看下面的例子:

<span style="font-size:14px;">var sayHello = function() {
return 'Hello var';
};

function sayHello(name) {
return 'Hello function';
};

sayHello();

//最终的输出为  "Hello var"</span>
实际上JavaScript的是按如下顺序解析的:
<span style="font-size:14px;">function sayHello(name) {
return 'Hello function';
};

var sayHello = function() {
return 'Hello var';
};

sayHello();</span>
注:不带var的function声明被提前解析了,因此现代的JS写法建议你始终使用前置var声明所有变量。
2.  避免全局变量名冲突的最好办法还是创建命名空间,下面是在JS中合建命名空间的几种常用方法:

a.  通过函数(function)创建

这是一种比较常见的写法,通过声明一个function实现,函数里设置初始变量,公共方法写入prototype,如:

<span style="font-size:14px;">var NameSpace = window.NameSpace || {};

/*Function*/
NameSpace.Hello = function() {
this.name = 'world';
};
NameSpace.Hello.prototype.sayHello = function(_name) {
return 'Hello ' + (_name || this.name);
};
var hello = new NameSpace.Hello();
hello.sayHello();    //  Hello world</span>
注:这种写法比较冗长,不利于压缩代码(jQuery使用fn代替prototype),而且调用前需要先实例化(new)。

b.  通过JSON对象创建Object

使用Object写成JSON形式可以写得紧凑些,如:

<span style="font-size:14px;"&
4000
gt;/*Object*/
var NameSpace = window.NameSpace || {};
NameSpace.Hello = {
name: 'world'
, sayHello: function(_name) {
return 'Hello ' + (_name || this.name);
}
};

//调用
NameSpace.Hello.sayHello('JS');  //  Hello JS;</span>
注:这种写法比较紧凑,缺点是所有变量都必须声明为公有(public)的,导致所有对这些变量的引用都需要加this指示作用域,写法也略有冗余。

c.  通过闭包(Closure)和Object实现

在闭包中声明好所有变量和方法,并通过一个JSON Object返回公有接口:

<span style="font-size:14px;">var NameSpace = window.NameSpace || {};
NameSpace.Hello = (function() {
//待返回的公有对象
var self = {};
//私有变量或方法
var name = 'world';
//公有方法或变量
self.sayHello = function(_name) {
return 'Hello ' + (_name || name);
};
//返回的公有对象
return self;
}());</span>
上述Object和闭包的改进型写法如下:

上个例子在内部对公有方法的调用也需要添加self,如:self.sayHello(); 这里可以最后再返回所有公有接口(方法/变量)的JSON对象。
<span style="font-size:14px;">var NameSpace = window.NameSpace || {};
NameSpace.Hello = (function() {
var name = 'world';
var sayHello = function(_name) {
return 'Hello ' + (_name || name);
};
return {
sayHello: sayHello
};
}());</span>
3.  Function的简洁写法:
这是一种比较简洁的实现,结构紧凑,通过function实例,且调用时无需实例化(new)。

<span style="font-size:14px;">var NameSpace = window.NameSpace || {};
NameSpace.Hello = new function() {
var self = this;
var name = 'world';
self.sayHello = function(_name) {
return 'Hello ' + (_name || name);
};
};

//调用
NameSpace.Hello.sayHello();</span>


相关链接:http://www.cnblogs.com/Iona/p/4733807.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JS命名空间