2012-12-02 26 views
3

这是我发现自己使用和调整多年的js模式。有没有人认识到这种JavaScript设计模式?

事情是,我经历了一些实验后陷入了它,我很想知道这种类型的模式是否有名称。我浏览了很多设计模式,但没有发现类似的东西(或者很简单,特别是对于模块化类型模式)。

var FOO = (function ($) { 
    var privateFuncA = function() { 
     ... 
    },   
    privateFuncB = function() { 
     ... 
    }, 
    self = { 
     init: function() { 
      privateFuncA(); // Call a private func 
      self.publicFunc(); // Call a public func 
     }, 
     publicFunc: function() { 
      ... 
     } 
    }; 
    return self; 
}(jQuery)); 

$(function() { 
    // Initialise FOO 
    FOO.init(); 
}); 

想法是保留所有命名空间,并允许伪公共/私人funcs。

如果我需要去模块化I将扩展底座Foo对象:如果你想从外面就可以调用publicFunc在扩展对象

// Extend FOO object 
FOO.Bar = (function ($) { 
    var privateFunc = function() { 
     ... 
    }, 
    self = { 
     publicFunc: function() { 
      ... 
     } 
    }; 
    return self; 
}(jQuery)); 

FOO.Bar.publicFunc() 

有谁知道这种类型的模式是否有名称,或者这种设计是否存在任何已知问题?

+0

我可能很厚,但与标准[模块模式]有什么区别(http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth)(这里与标准命名空间模式)? –

+0

不,你不是很厚:]我刚刚没有遇到那篇文章 - 感谢分享,有用的阅读。 – benpink

回答

3

当然。它只是Christian Hielmann的“Revelling Module”模式的延伸,它本身就是Douglas Crockford模块模式的延伸。

在我的很多例子在这里的话,我会用一些非常相似,除了与public_interface更换self,要尽量做到更加明显,什么是公共私人private-static

var built_module = (function() { 

    var private_data = "", 
     private_method = function() { /* ... */ }, 

     public_interface = { 
      public_method : function() { /* ... */ }, 
      public_data 
     }; 

    return public_interface; 

}()); 

和作为构造:

var built_constructor = (function (env_params) { 

    var static_data = "", 
     static_method = function() { /* ... */ }, 

     public_constructor = function (params) { 
      var private_data = "", 
       private_method = function (params) { /* ... */ }, 

       public_interface = { 
        public_method : function() { /* ... */ }, 
        public_data 
       }; 

      return public_interface; 
     }; 

    return public_constructor; 
}(envArgs)); 


var myInstance = built_constructor(myArgs); 

“静态”数据/性能在外部闭合的,因此,所有的内封闭的内VARS /函数具有访问它们,而“静态”方法无法访问任何实例方法/数据,而无需将参数传递到函数中。

您可以从这里以任何方式扩展它 - 删除返回值,而是将public_interface指定为对象的属性,或默认为window(用于名称间距)。

+0

超级。感谢您的快速历史和例子。很有用。 – benpink

+0

@benpink不用担心。我想我应该在这里提到尼古拉斯扎卡斯。他写了几本好书,但我发现他为我完成的最好的事情,个人是一个关于大型JS架构的讨论。他实际上以一种非常干净,独立的方式创建了一个沙盒环境。当然,为了达到目标,您可能需要了解/实现承诺/延期异步模式和/或pub-sub/moderator/observer/emitter消息传递系统。值得一看,YouTube上至少有3个不同的版本。 – Norguard