用Javascript实现单模式共享

作为一种单一模式的软件开发模式已经被广泛的应用在许多面向对象的语言,在Javascript中,单一的模式也非常广泛的应用,但由于Javascript语言有其独特的面向对象方式,导致一些传统的面向对象的语言,虽然在一个单一的思维模式是一致的实现仍然是一个差不过。

首先,让我们看看在传统的面向对象语言的单模式的定义一看:单体模式是一个类,只能实例化一次,可以通过一个众所周知的访问点访问。这个定义有传统的面向对象语言的两个突出特点,即类和实例化,所以传统的面向对象语言,单模式是基于其自然特性和实例化,使用class关键字定义一个类,该类可以被实例化,通过新的关键字,但要保证每一次新的实例化之后是相同的实例或只有通过新的调用它的构造函数A.

让我们来看一下Javascript中单模态的定义:单体是用来划分名称空间和组织一批相关的方法和属性的对象。如果它可以被实例化,它只能被实例化一次。与上述定义的对比,你会发现这里的实体的定义实际上是定义为一个对象,而不是在传统的面向对象语言的一类,这表明Javascript语言是基于对象的。同时,背同时指出,如果它可以被实例化,它证明了在Javascript中的单体的定义应该有几个方面,有一个或几个可以被实例化使用new关键字创建一个单一的目标,但这种方式不是Javascript本身的固有特性,因为使用new关键字创建对象。事实上,所有通过函数来模拟构造函数的定义(虽然6开始支持类的关键词,但并没有得到广泛的支持,所以浏览器)的自然特征如何使用Javascript来实现单模式


var
所切割:真,
attribute2:10,
方法:函数(){

},
方法:功能(arg){

}
}




在这里,一个单例对象的定义,包含了一些属性和方法,其中将包括在页面中,您创建此对象时加载JS,singleton.method1用于电话呼叫,它与页面加载JS解析的实现过程实例化完成,我们没有使用new关键字来实例化这个对象,这是Javascript中的单模式和传统的面向对象的语言,一个很大的不同。这种方法是简单和容易理解,但它也有一些缺点,一个明显的缺点是,它并没有提供一个命名空间,如果页面中其他程序员也定义了一个单独的变量,那么就容易重写混淆对象单一,所以为了解决这个问题,C改变文字如下:


VAR聚友网= { };
聚友网。单= {
所切割:真,
attribute2:10,
Method1:function () {

},
方法:功能(arg){

}
}








在这里,我们定义了一个聚友网的命名空间,然后单目标单山下这个对象,这大大减少了与其他程序员的矛盾以及滥用的可能性,即使其他人定义在全球范围的单一变量,对单个对象的无污染,实现了分工在命名空间定义的前面说一些相关的属性和方法的组织功能。

这种方法还有缺点。单体对象的所有属性和方法都是通用的,并且可以随时访问和修改外部对象。因此,我们使用闭包来模拟私有属性和方法。


聚友网。Singleton =(函数(){()
无功privateattribute1 = false;
无功privateattribute1 = {1,2,3};
功能privatemethod1(){

}
功能privatemethod2(){

}

返回{
publicattribute1:真,
publicattribute2:10,
publicmethod1:函数(){
privateattribute1 =真;
privatemethod1();
},
publicmethod2:功能(arg){
privateattribute1 = { 4,5,6 };
privatemethod2();
}

}

});






在这里,我们直接到单个对象分配一个匿名自执行函数,并在函数关键字var函数用于定义的属性和方法分别在外部函数(单个物体外)不能直接访问,因为执行的功能,内部空间范围的恢复将是能够模拟使用关闭私有属性和方法的原因。在这个功能(关闭),最后返回包含该对象的一些公共方法和属性的对象,你可以在外部直接调用,同时这些公共方法在函数内部定义的,所以你可以调用私有属性和方法,但只有通过GH的公共方法和属性返回完成某些操作不,singleton.privatemethod1可以直接调用这些属性。这使得单体对象不仅隔离外界直接访问其属性和方法,但也提供了一些共同的属性和方法做一些操作外面的世界。

这个匿名函数是因为很多js库执行单一模式结构中得到广泛的应用,但仍有一个问题,如果我们不需要加载页面时使用的对象,该对象是创造更多的成本费用(如大量计算的需要或需要多个访问DOM树和其属性),它可以合理地要求它创造它,而不是用js分析进行直接的创造,这个概念叫做懒加载(延迟加载),然后修改上面的代码如下:


聚友网。Singleton =(函数(){()
无功uniqueinstance;
函数构造函数(){
无功privateattribute1 = false;
无功privateattribute1 = {1,2,3};
功能privatemethod1(){
}
功能privatemethod2(){
}
返回{
publicattribute1:真,
publicattribute2:10,
publicmethod1:函数(){
privateattribute1 =真;
privatemethod1();
},
publicmethod2:功能(arg){
privateattribute1 = { 4,5,6 };
privatemethod2();
}

}
}

返回{
getInstance(){:功能
如果(!uniqueinstance){
uniqueinstance =构造函数();
}
返回uniqueinstance;
}
}

});




在这里的第一个匿名函数定义了一个私有变量uniqueinstance,作为判断处理单目标是创建,然后把单个对象的定义放在一个函数调用的构造函数是属性和方法,只需调用函数,将创建单个对象的身体,否则它不会直接创造的。然后,返回一个对象,它包含一个getInstance方法,这种方法是外部调用,调用的方法首先确定单个对象存在,如果存在将直接返回,或者调用构造函数函数的单目标的结构就是要回到它。最后,如果我们把一个方法的单一目标需要使用myspace.singleton.getinstance()。publicmethod1(),在这里,只有当我们调用这个将创建单个对象,否则单个对象不会自动创建,这实际上是按需加载或延迟加载实现的。