JavaScript模块 Pattern

分享于 

13分钟阅读

Web开发

  繁體 雙語

介绍

在本文中,我将讨论JavaScript中被称为模块 Pattern的最佳编码实践。

模块 Pattern 在JavaScript世界中非常常见,它的重要性非常重要。 它帮助我们编写简洁的面向对象的JavaScript。 模块 Pattern 限制开发人员创建多个全局变量。 为web应用程序的性能提供较少的全局变量总是一个很好的实践。 因这里,这个 Pattern 提高了网站的性能,同时给出了面向对象的程序设计实践。

什么是模块 Pattern

在JavaScript编程语言中,函数可以作为模块使用。 有时,需要创建一个单独的对象,而不是创建类的实例。 inside 模块,内部函数具有 static 作用域的它的他定义的变量和函数。

使用JavaScript语言编写的最大应用程序只有 singletons。 因此,它们都是用模块 Pattern 编写的。

模块可以被看作是 C# 中的单一类。 在模块中,定义的所有变量仅在模块中可见。 模块中的方法具有范围和访问共享 private 数据和 private 方法的权限。 因此,这些方法也被称为特权方法

因此,通过创建一个匿名函数,将以简单对象文本格式返回一组特权方法。 而且由于闭包原理,这些特权方法可以访问匿名函数的内部方法和变量。 我们称它为模块 Pattern

特权方法

你还可以编写你不希望公开到其他世界的方法,private 变量,同时也可以编写 public 和特权方法。 这种 Pattern的好处在于,你可以很好地从你的方法访问 private 方法和变量,这些方法称为特权方法

关闭

为了学习模块 Pattern,必须注意闭包原理。 通过使用闭包模块 Pattern 变得非常有用和强大。 闭包原则表明,父函数的任何内部函数 inside 都具有对它的他内部函数和变量的范围。 在模块 Pattern 中,特权方法具有到其他 private 变量和模块方法的范围。

自执行函数

在模块 Pattern 中,我们通过编写自执行的方法来创建一个全局Singleton对象。 自执行方法是一个匿名方法,它只被自己调用。 查看解释如何编写自执行方法的below 代码。

自执行函数示例
(function ( ) { 
 //create variable//var name ="rupesh";//create method//var sayName = function ( ) {// alert(name);//};})( );//calling this method. 

在 上面 代码中,我已经声明了一个匿名方法,只有在执行这个JavaScript代码时,它才被 writing(); 调用。 因此它被称为自执行方法。

模块 Pattern 示例

理解模块 Pattern的思想,自已经执行方法,闭包现在让我定义模块 Pattern 样式。 请参见 below 代码:

//Single Global Variable"Module"var Module = ( function ( ) {
 var privateVariable = "some value",
 privateMethod = function ( ) {
 //do something. };
 //returning one anonymous object literal that would expose privileged methods.return {
 //the method inside the return object are //called as privileged method because it has access //to the private methods and variables of the module. privilegedMethod : function ( ) {
 //this method can access its private variable and method //by using the principle of closure.  alert(privateVariable); //accessing private variable. privateMethod( ); //calling private method }
 };
})( ); 

这里 Module 是公开给文档的单个全局变量。 我们声明,调用一个匿名方法并将它分配给 Module 变量。 现在我们可以通过编写 Module.privilegedMethod(); 内部特权方法调用 privilegedMethod 来访问它的private 变量和 private 方法。 因为他们在自己的static 范围内。 如果我们有任何不希望公开的数据或者方法,我们可以将它们放在 private 方法中。

我们还可以不同的方式编写 上面 代码,请参见 below 方法:

//Single Global Variable"Module"var Module = ( function ( ) {
 var 
 privateVariable = "some value", privateMethod = function ( ) {
 //do something. }
 //object literal that would have privileged methods., retObject = {
 //the method inside the return object are //called as privileged method because it has access //to the private methods and variables of the module. privilegedMethod : function ( ) {
 //this method can access its private variable and method //by using the principle of closure.  alert(privateVariable); //accessing private variable. privateMethod( ); //calling private method }
 };
 //returning the object.return retObject;
})( ); 

public 方法没有访问 private 方法和变量的权限,只有该模块可以访问的特权方法 inside。 让我们看看。

我们可以通过 below 方法在模块中创建 public 方法:

//augmenting public method in the moduleModule.publicMethod1 = function () {
 //do something...//However here we will not have access to the private methods of the Module.//We can call the privileged method of the module object from here.//And by the privileged method we can call or access the inner private// methods and variables correspondingly  Module.privateMethod ( ); // this is not possible.//calling a privileged method of module  Module.privilegedMethod ( ); // this can be possible. }

在 上面 示例中,扩展到模块的public 方法 publicMethod1 没有访问 Module 对象的privateMethod的权限。 为了访问 private 方法或者变量,我们可以调用模块 inside的特权方法 public。 这就是这个 Pattern的好处。 在我们的上面 示例中,我们可以调用 Module.privilegedMethod()

模块 Pattern 示例

我已经创建了一个示例. NET 应用程序,在本文中也是如此。 在该。NET应用程序中,我创建了一个模块 Pattern JavaScript函数。 让我们来讨论同一个函数。 请参阅 below 代码段:

//One Global object exposed. var SearchEngine = (function ( ) { 
 //Private Method.var luckyAlgo = function ( ){
 //create one random number.return Math.floor(Math.random()*11);
 }
 //Returning the objectreturn {
 //privileged method. getYourLuckyNumber : function ( ){
 //Has access to its private method because of closure.return luckyAlgo(); 
 }
 } 
} ) ( );//Self executing method.

,代码Fragment中,我有一个名为的全局变量executed的匿名方法被分配给了 SearchEngine 变量。

SearchEngine 有一个 private 方法 luckyAlgo 和一个特权方法 getYourLuckyNumber. 通过封装一个匿名对象来返回特权方法。 可以全局访问 SearchEngine,只有一个特权方法。 而特权方法可以调用它的局部方法 luckyAlgo,因为这是闭包的原理。 在 上面 示例中,如果调用 getYourLuckyNumber 方法,那么它将返回一个随机数。

创建子模块

我们还可以通过使用子模块扩充模块对象来创建子模块。 它将以同样的模块 Pattern 方式再次出现。 参见 below 示例,我已经根据相同的模块 Pattern 创建了一个更多的subSearch 对象 inside SearchEngine 对象。

//Augmenting the module with submoduleSearchEngine.subSearch = (function ( ) {
 //Private variable.var defaultColor = "Orange";
 //private method.var myColorAlgo = function (num) {
 switch(num){
 case1:
 defaultColor ="Green";break;
 case2:
 defaultColor ="Black";break;
 case3:
 defaultColor ="Yellow";break;
 case4:
 defaultColor ="White";break;
 case9:
 defaultColor ="Red";break;
 }
 };
 return {
 //privileged method getYourLuckyColor : function(){
 //access to private variable because of closure. myColorAlgo(SearchEngine.getYourLuckyNumber());
 return defaultColor;
 }
 };
})();

在 上面 示例中,如果我们调用 getYourLuckyColor 方法,那么它将根据随机数给你一个颜色名。 我知道这些方法不太实用,我只是想要解释这个概念。

扩展模块

我们可以通过包装 inside 一个新模块来扩展现有模块。 这样,我们就可以很好地访问/重写旧模块的现有方法。 请参见 below 代码:

var Module1 = ( function (oldModule) {
 var 
 //assigning oldmodule in to a local variable. parent = oldModule;
 //overriding the existing privileged method. parent.privilegedMethod = function ( ){
 //do something different by overriding the old method. };
 //private method accessing privileged method of parent module.var privateMethod2 = function ( ) {
 parent.privilegedMethod();//can access privileged method of Module parent.publicMethod1(); //can access public method of Module }
 return {
 newMethod : function ( ) {
 ///do something for this brand new module.///use some functionality of parent module.///parent.privilegedMethod( ); }
 };
} )(Module);//Module object is the existing module that I want to extend. 

上面 示例中,我描述了模块 Pattern的高级特性,在这里可以通过扩展。扩充和重写模块来使用现有模块。

通过调用匿名方法,然后将它分配给一个名为 parent的局部变量,我已经传递了旧的Module 对象( ( 在模块 Pattern 部分中,我们已经创建了一个模块对象) )。 现在,我可以访问 private 中父 Modulepublic/privileged 方法。特权和 publicModule1 对象的方法。

当我还可以重写旧 Module的现有方法时,这个 Pattern的好处。 你可以看到,我已经覆盖了 Module 对象的privilegedMethod。 同样,我也可以重写 Module 对象的public 方法

结束语

我给出了非常简单的例子。 但是,你可以学习这个 Pattern 并创建非常复杂的编码。 你必须了解 YUI 这是一个很棒的JavaScript库,它是根据模块 Pattern的原理编写的。 我个人经验,我曾经在模块 Pattern 中编写过JavaScript代码,我很喜欢它。 我最喜欢这个 Pattern,也有很多有趣的东西。 希望本文能帮助你。 请给出你的意见和建议。


相关文章