JavaScript命名空间 || 名字空间

命名空间 || 名字空间 :
javascript中的模块和名字空间是不可区分的内容。
JavaScript 的命名空间并不是真正的命名空间, 只是在脚本内部创建一个封闭的小空间, 必须通过特定的空间名称才能对空间内部的代码进行访问。
 
作用:
这样可以防止同名函数和变量发生冲突, 也可以更方便地管理代码, 就像 .NET 的命名空间 (namespace) 和 Java 的包 (package) 一样.
 

为什么需要命名空间?
1. JavaScript 是不会禁止你重复定义函数和变量的, 但他只会使用最后定义的版本, 也就是说, 这将导致前面的失效, 令系统出错. 比如, $(id) 是最常用的, 也许你会毫不犹豫的在自己的脚本上定义这个函数, 但是当你用上 prototype/jQurey, 你就会发现, 它和 prototype/jQuery 的函数冲突, 并导致你的页面出错.
怎么办? 这时候就需要命名空间了. 使用之后就能防止和某些插件的代码发生冲突.
2. 如果你要为自己准备一套常用的函数, 或者自己搭建一个 framework, 那这个方法可以使你的代码维护起来更加方便. 例如我们的cn.*
 
怎么使用命名空间?
var Namespace = Namespace || {};
Namespace.name = "F7";
Namespace.getName = function(){  
 alert(this.name); 
}; 
Namespace.setName = function(str){ 
 this.name = str || "kang";
};
javascript模块化的第一条规则:一个模块不应该为全局名字空间添加多于一条的标记。
解释:上例中的 var Namespace = {};其实是在全局名字空间(全局对象)的一个属性。通俗的讲:除了给全局命名空间定义一个模块的命名空间,其它的你一句代码都不要写。
将上面我们建立的ModuleClass模块保存成一个JS,进行整站通用。
 
定义的模块名称一样该怎么办?
首先,这样的机率不大,如果真的有,我们可以使用java的命名方式。如下:
命名空间为:com.公司名.项目名.空间名;
也可以向我们的china_class一样,采用cn = cn || {};特定的名称,不允许从新定义cn,只能扩展cn.*
还有其他的一些形式:
 
/* 直接定义window下的属性的形式 */
(function() {
 // 通过 ID 获取 Element 对象
 function $(id) {
  return document.getElementById(id);
 }
 
 // 显示对应 ID 的对象的节点类型名字
 function myMethod(id) {
  alert($(id).nodeName);
 }
 
 // 这是对外的接口
 window['Namespace']= {}
 window['Namespace']['$'] = $;
})();
Namespace.$("id");
 
 
/* 返回方法属性给变量的形式 */
var Namespace = (function() {
 var name = "F7";
 function getName(id) {
  alert(name);
 };
 
 function setName(str) {
  name = str || "kang";
 };
 
 return {
  getName:getName,
  setName:setName
 };
})();
Namespace.getName();
 

Comments are closed.