命名空间模式
1 | var MYAPP = MYAPP || {}; |
模块模式
1 | MYAPP.namespace('MYAPP.utilities.array'); |
模块模式的变体
揭示模块模式:所有的方法都需要保持私有性,并且只能暴露那些最后决定设立API的那些方法。
创建构造函数的模块:包装了模块的即时函数最终将会返回一个函数,而不是返回一个对象。
将全局变量导入到模块中:将全局变量以参数的形式传递到包装了模块的即时函数中。
沙箱模式
沙箱模式提供了一个可用于模块运行的环境,且不会对其他模块和个人沙箱造成任何影响。
在命名空间模式中,有一个全局对象。在沙箱模式中,则是一个全局构造函数,让我们称之为Sandbox()
。可以使用该构造函数创建对象并且还可以传递回调函数,它变成了代码的隔离沙箱运行环境。
使用示例
1 | Sandbox(['dom', 'event'], function(box){ |
使用本沙箱模式时,可以通过将代码包装到回调函数中从而保护全局命名空间。可以根据所需要的模块类型创建不同的沙箱实例,并且这些实例互相独立运行。
具体实现
1 | function Sandbox(){ |
在这个示例实现中,我们并不关心从其他文件中加载所需的功能,但这绝对也是一个可选的实现功能。比如YUI3库中就支持这种功能。
当我们知道所需的模块时,便可以据此进行初始化,这表示可以调用实现每个模块的函数。
该构造函数的最后一个参数是一个回调函数。该回调函数将会在使用新创建的实例时最后被调用。这个回调函数实际上是用户的沙箱,它可以获得一个填充了所需功能的box
对象。
我觉得沙箱模式的缺点是Sandbox.modules
暴露在外,应该使用更好的AMD(Asynchronous Module Definition)模式
链模式
链模式的优点在于它可以帮助你考虑分割函数,以创建更加简短、具有特定功能的函数,而不是创建尝试实现太多功能的函数。从长远看来,这提高了代码的可维护性。
链模式的缺点在于以这种方式编写的代码更加难以调试。或许知道在某个特定的代码行中发生错误,但是在此行中实际执行了太多的步骤。当链中多个方法的其中一个静默失效时,无法知道是哪一个方法发生失效。
在任何情况下,识别出这种模式都很有好处。当编写的方法并没有明显和有意义的返回值时,可以总是返回this
。
method()
方法思想(并不是很推荐)
example.
1 | var Person = function(name){ |
method()
方法实现
1 | if(typeof Function.prototype.method !== 'function'){ |