代码改变世界

Pro javascript design pattern 读书笔记之 A singleton with private members 之Using Using closures

2008-10-27 10:29  wlstyle  阅读(170)  评论(0)    收藏  举报

Using closures(使用闭包)

第二种在单一对象中得到私有成员的方式就是创建一个闭包。这个和我们在第三章中创建一个真正的私有成员很相似。但是有一个主要的不同,在之前,我们向构造器中(没有使用this 关键字)添加一个变量和函数使他们私有化,我们同样在构造器中定义了所有的特权方法但是使用了this关键字这样就使他们可以被访问。在构造器中所有的方法和属性将在每一个类的实例中重新创建。这样可能造成潜在的无效性。

 因为一个单一的对象只实例化一次,你不用担心在构造器中有多少成员被定义。每一个方法和属性只是创建一次。所以你们能在构造器中定义所有的属性(这样就在同一个闭包中了)。基于这一点,所有的单一对象有object literals,就像这样:

MyNamespace.Singleton={};

现在你可以使用一个函数,马上执行一个函数,提供同样的东西。

MyNamespace.Singleton=function(){

Return {}

}();

在这些上面的两个例子中,有两个版本的MyNamespace.Singleton他们完全一致。有一点要明确我们在第二个例子中没有为MyNamespace.Singleton分配一个函数。我们使用了一个匿名函数来返回一个对象,这个对象就是分配给MyNamespace.Singleton变量的对象。在大括号后面加一对扩号,马上执行这个匿名的函数。

 一些开发者发现在在函数定义的后面加上一对扩号表示这个函数在定义的时候就被执行。这个特别有用如果单一对象很庞大,你能发现这个函数创建了一个闭包。这就是上面的单一对象有一对额外的圆扩号。

MyNamespace.Singleton=(function(){

   return {};

})();

你能在返回改对象之前以相同的方式为单一对象添加公有的方法。

 

using closures

 

这个函数包创建了一个闭包这样就有了私有成员,任何在匿名函数内部声明的变量或者函数只能被其它在声明在相同闭包的函数访问。这个闭包一直存在即使在匿名函数已经被返回。所以在闭包内部声明的函数和变量,返回的对象都可以访问。

以下是如何为匿名的函数添加私有的成员。

 

using closures with private member

 

这个特别的单一设计模式还被称为模型模式,归因于模型化,然后命名一个相关联的属性和方法。