读书人

ExtJS设计方式-模块模式(Module Patte

发布时间: 2012-09-02 21:00:34 作者: rapoo

ExtJS设计模式-模块模式(Module Pattern)
《JavaScript: The Definitive Guide, 5th Edition》一书的8.8章节其中有一段这样的描述:

When you define a nested function, however, the scope chain includes the containing function. This means that nested functions can access all of the arguments and local variables of the containing function.

这句话的主要意思可以理解为:
当你在js中定义一个内部函数时,此内部函数的作用域链将此内部函数包含的所有函数都include到了其中。这就意味着内部函数可以访问所有的包含在其中的函数的参数和本地变量。

在ExtJS的设计中大量利用了这个特点设计代码,获得的最大好处有两点:

1、实现封装

这种写法保证了此方法中定义的内部函数(nested function)与本地变量(local variables)不能被外部访问,同时只允许特权(公有)方法访问这些内部函数或者变量。作用类似于javabean的private成员以及getXXX方法。

2、性能提升(单例模式)-通过模块模式实现

模块模式与单例模式的关系是什么?在提到这个之前不得不提到javascript的单例模式(Singleton)。在javascript中,单例(Singleton)就是指只有一个实例的对象,而不需要用new关键字去创建一个对象实例。单例其实有点类似于java里面的静态类。在javascript中,是以对象字面量的方式来创建单例对象的,也就是以花括号包裹起来的键值对的JSON形式来创建的。例如:



上面的代码中,我们创建了一个匿名函数并赋值给变量Util,然后立即调用这个函数返回可以公开的公有方法和属性的对象实例。在匿名函数内部定义了本地(私有)变量A,C,内部(私有)函数methodA(),methodC()。然后将一个对象实例作为函数值返回,这样返回的对象中只包含可以公开的属性(指变量B)和方法(指函数methodB(),methodD())。

单例对象中公有属性和公有方法的调用与一般对象的属性和方法调用一样,使用点表示法或者方括号语法来调用单例对象的公有成员。

让我们通过以下代码,进一步验证我们的想法。

执行以下代码,会得到TypeError: Util.methodA is not a function
//公有变量可以通过单例模式访问alert(Util.B);




所以,模块模式的适用场景:需要对单例进行一些初始化,又需要对私有变量进行封装时。

参考资料链接:
http://www.cnblogs.com/fengmiaosen/archive/2011/01/11/1933219.html

参考文档:
<JavaScript: The Definitive Guide, 5th Edition> By David Flanagan

读书人网 >软件开发

热点推荐