JQuery JavaScript设计:自执行function还是对象文字?

我很好奇在构造封装代码块时是否有与JQuery相关的最佳实践。

通常,当我构建一个页面时,我喜欢将该页面中使用的函数封装在一个对象中。 这允许我在构建应用程序时进行一些封装。 没有什么比讨论一堆JavaScript文件更讨厌了

function doSomethingOnlyRelevantOnThisPage() { // do some stuff } 

我这使得设计混乱,并没有很好地封装function。

通常在许多框架中,有一个标准用于执行此封装。

在Mootools中,他们喜欢Object Literal Notation:

 var Site = { // properties and methods } 

在YUI中,他们喜欢自执行函数表示法:

 (function() { // properties and methods })() 

关于第二个示例的好处是创建了一个闭包,从而允许您定义私有属性和方法。

我的问题是:任何JQuery爱好者都有创建这些干净封装结构的最佳实践吗? 使用它们的理由是什么?

由于我已经使用jQuery了一段时间,我已经决定了一个适合我的标准模式。

它是YUI模块模式与混合了一些jQuery插件模式的组合 。 我们最终使用了自执行闭包模式。 这在以下几个方面是有益的:

  1. 它将代码保持在最低限度
  2. 它强制将行为与表达分开
  3. 它提供了一个阻止命名冲突的闭包

这就是它的样子:

 ;(function($) { var myPrivateFunction = function() { }; var init = function() { myPrivateFunction(); }; $(init); })(jQuery); 

我们意识到,分配函数执行的结果(类似于YUI模块模式)会暴露可能从表示代码中调用的代码。 我们想要防止这种情况,所以这种模式适合。

当然,我们可以编写内联的init方法,而无需为函数定义变量。 我们同意明确定义init函数使代码更清晰。

如果我们想在页面/外部js文件之间共享function会发生什么? 我们简单地挂钩jQuery提供的现有机制来扩展jQuery对象本身 – 扩展函数。

如果函数是静态的,我们使用$ .extend,如果它们在包装集上运行,我们使用$ .fn.extend函数。

希望这有助于某人。

我在开发时使用YUI和jQuery(YUI小部件和一些便利函数,jQuery选择器和javascript“扩展”),我使用的一般javascript模板是这样的:

 /*global YAHOO, $ */ // Create the public-scope accessable namespace for this page YAHOO.namespace('Project'); YAHOO.Project.page = function() { // Private members var self = {}; // Public members var pub = {}; pub.init = function() { }; return pub; } (); // When the DOM is loaded, initialize this module $(document).ready(YAHOO.Project.page.init); 

现在很清楚,如果你不想使用YUI,你可以删除YAHOO.namespace()调用,但那是基本的大纲。 它使用对象文字表示法,但也允许您定义私有属性和方法。

请记住,在调用私有成员或引用私有变量时,请将它们引用为self.funcName() 。 您可以在self对象之外定义它们,但随后在对象中的任何位置都会出现错误,您要在其中确定size_of()是私有方法还是在其他地方全局定义。

我通常遵循原型模式:

 MyFunction = function(param1, param2) { this.property1 = param1; // etc. } MyFunction.prototype = { memberOne: function(param1) { // ... }, memberTwo: function(param2) { } } 

你会得到一个“构造函数”(函数本身)和封装的“方法”和“字段”。

对于习惯使用基于类的OO语言的人来说,这更容易:)