简介Javascript模块化编程的入门知识。
- 最简单的实现
1 | var Calc = function () { |
问题是,每次都要new一个对象,占用内存。那我们干脆在全局定义一个实例,存储这个对象。
- 先看下闭包
1 | /* 方式1 */ |
- 引用一个全局变量
1 | (function ($, Yahoo) { |
这里只是访问了全局对象,我们经常需要声明全局变量。
- 声明全局变量
1 | var myModule = (function () { |
看起来这个已经可以了,但是这种做法适用于独立开发一个模块的情况,无法协作开发同一个myModule,浏览器同时引入多个定义myModule对象的代码时,后引入的会覆盖先引入的,所以,就需要使myModule可扩展。
- 扩展
1 | var myModule = (function (me) { |
这样就对myModule扩展了addPhoto方法,并且原来的addTopic方法还在。但是又出现新的问题,必须先写第4步的声明myModule,如果直接执行第5步,将myModule传为参数,将报错:
1 | Uncaught TypeError: Cannot set property 'addPhoto' of undefined // myModule is undefined |
- 松耦合扩展
1 | /** |
松耦合扩展也是有限制的,比如无法重写属性或函数,紧耦合扩展限制了加载顺序,同时提供了重载的功能。
- 紧耦合模式
1 | var myModule = (function (me) { |
如果想使用重载前的方法,可以调用oldAddPhotoMethod方法。
- 克隆与继承
1 | var myModule = (function (old) { |
这种方式也会有个问题,就是新对象并没有复制老对象的属性和方法,而是引用。也就是说,如果老对象的属性或方法被修改后,新的对象也会同步变化。
1 | var blogModule = (function (me) { |
任何文件都可以对他们的局部变量_private设属性,并且设置对其他的文件也立即生效。一旦这个模块加载结束,应用会调用 blogModule._seal()”上锁”,这会阻止外部接入内部的_private。如果这个模块需要再次增生,应用的生命周期内,任何文件都可以调用_unseal() ”开锁”,然后再加载新文件。加载后再次调用_seal()”上锁”。