JavaScript 模块
- 一般来讲, 模块是一个独立的JavaScript文件
- 模块文件可以包含一个类定义、 一组相关的类、 一个实用函数库或者是一些待执行的代码
- 以模块的形式编写代码,任何符合模块编码形式JavaScript代码段,都可当做一个模块
- JavaScript中未定义支持模块的语言结构, 所以在JavaScript中编写模块化的代码,其实是遵循某一种编码约定
- 模块化支持大规模的程序开发, 处理分散源中代码的组装,确保代码正确运行, 即便其中包含不期望出现的模块代码, 也可正确执行
- 不同的模块,应避免修改全局执行上下文
- 已使后续模块应当在其所期望运行的原始(或接近原始)上下文中执行
- 模块应当尽可能少地定义全局标识,理想状况是,所有模块都不应当定义超过一个全局标识
1 用做命名空间的对象
- 在模块创建过程中避免污染全局变量的一种方法是使用一个对象作为命名空间
- 它将函数和值作为命名空间对象属性存储起来(可以通过全局变量引用)
- 不定义全局函数和变量
- 使用对象作为命名空间,常用做法是在对象空间内创建类
//定义sets对象作为空间命名对象 //将Set类的构造函数、成员等作为其属性 var sets = { Set:function(){}; Set.prototype:{ constructor:Set, m1:function(){}, m2:function(){} } }; //使用时,需要通过命名空间来调用所需的构造函数 var S = new sets.Set(); //如果频繁使用,也可先导入Set类到全局空间 var Ss = sets.Set; var SS = new Ss();//不在使用前缀
- 多重命名空间嵌套,如果sets模块是另外一个组更大的模块集合,命名空间是collections.sets,模块代码写法示例
//sets模块开始写法推荐: var collections;//声明(或重新声明)这个全局变量 if (!collections){ collections={};//如果它原本不存在,则创建一个顶层的命名空间对象 } collections.sets= {}//将sets命名空间创建在它的内部 collections.sets.AbstractSet = function(){}//在collections.sets内定义set类
- 最顶层的命名空间往往用来标识创建模块的作者或组织,并避免命名空间的命名冲突。推荐方法时常用互联网域名组成部分反转来命名
- 这样创建的命名空间前缀是全局唯一的,一般不会被其他模块作者采用
- 比如网站myweb.com,命名空间就是com.myweb.collections.sets
- 使用很长的命名空间来导入模块的方式非常重要,一般应将整个模块导入全局命名空间,而不是导入(命名空间中的某个)单独的类
- var sets = com.myweb.collections.sets;
- 按照约定,模块的文件名应当和命名空间匹配。
- sets模块应当保存在文件sets.js中
- 如模块使用命名空间collections.sets,sets.js文件应当保存在目录collections/下(这个目录还应当包含另一个文件maps.js)
- 使用命名空间com.myweb.collections.sets的模块应当在文件com/myweb/collections/sets.js中