Javascript 本身不支持命名空间,因此需要解决方法。
在我们创建 JavaScript 库时,命名空间发挥着重要作用。我们可以将组成 JavaScript 库的分段 JavaScript 文件 (*.js) 封装在命名空间中,而无需定义全局函数或类。比如本章多次出现的Person,我们可以将它作为库的一部分封装到合适的命名空间中:
代码 5-13:
复制代码代码如下:
var com = {};
com.anyjava = {};
com.anyjava.Person = 函数(名称){
//私人会员
var _name = 名称;
//访问器
this.getName = function() {
返回_name;
};
this.setName = function(name) {
_name = 名称;
};
};
//原型
com.anyjava.Person.prototype = {
吃:函数(){
alert(this.getName() + "正在吃东西。");
},
睡眠:函数(){
alert(this.getName() + "正在睡觉。");
},
walk:function() {
alert(this.getName() + "正在走路。");
}
};
var dirk = new com.anyjava.Person("Dirk");
dirk.eat();
从代码5-13中,我们得到了一个更符合Java开发者习惯的命名空间,并且在实例化Person对象的时候,还指定了我们的命令空间路径。
这里有个小技巧,如果你使用的是别人开发的 JavaScript 库unity string 类的命名空间,命名空间规划比较完整,你可能会厌倦每次都写冗长的命名空间。比如你使用我开发的 JavaScript 库,在 com.anyjava.control.ui 命名空间下,有很多你会用到的扩展 UI 控件,我猜你不想写很多次 var xxx = new com .anyjava.control.ui.XXX()。通过指定命名空间别名,我们可以编写更少重复的代码,如代码5-14所示代码5-13中实例化Person的另一种方法:
代码 5-14:
复制代码代码如下:
var ns = com.anyjava;
var dirk = new ns.Person("Dirk");
dirk.eat();
我要说的最后一件事是使用命名空间时的一个警告。在编写 JavaScript 库时,大多数情况下命名空间声明语句可能会同时出现在一个 JavaScript 文件中的多个位置UI界面,或者出现在多个 JavaScript 文件中,但 JavaScript 语言的特点是最后声明的变量会覆盖前一个。同名变量,这需要我们注意重复声明的问题,也就是说,在声明命名空间对象时,建议先判断命名空间对象是否已经存在unity string 类的命名空间技能特效,如代码5-15所示:
代码 5-15:
复制代码代码如下:
if (typeof com.anyjava == "undefined") var com.anyjava = {};
这样我们可以保证“com.anyjava”对象只声明一次。