jQuery库中使用的设计模式


78

jQuery高度关注DOM,并围绕DOM提供了很好的抽象。在此过程中,它利用了昨天刚刚打动我的各种众所周知的设计模式装饰器模式就是一个明显的例子。jQuery对象围绕常规DOM对象提供了新的附加功能。

例如,DOM具有本机的insertBefore方法,但是没有相应的insertAfter方法。有多种实现方式可以填补这一空白,而jQuery是一个提供此功能的此类库:

$(selector).after(..)
$(selector).insertAfter(..)

还有许多其他示例在jQuery中大量使用Decorator模式。

您是否注意到库本身还包含其他大小的设计模式示例?另外,请提供模式用法的示例。

我把它变成一个社区Wiki,因为我相信人们喜欢jQuery的各种事情都可以追溯到众所周知的设计模式,只是这些模式的名称通常不提及它们。这个问题没有答案,但是对这些模式进行分类将提供对库本身的有用见解。

Answers:


96

延迟初始化:

$(document).ready(function(){
    $('div.app').myPlugin();
});

适配器或包装纸

$('div').css({
    opacity: .1 // opacity in modern browsers, filter in IE.
});

正面

// higher level interfaces (facades) for $.ajax();
$.getJSON();
$.get();
$.getScript();
$.post();

观察者

// jQuery utilizes it's own event system implementation on top of DOM events.
$('div').click(function(){})
$('div').trigger('click', function(){})

迭代器

$.each(function(){});
$('div').each(function(){});

战略

$('div').toggle(function(){}, function(){});

代理

$.proxy(function(){}, obj); // =oP

建造者

$('<div class="hello">world</div>');

原型

// this feels like cheating...
$.fn.plugin = function(){}
$('div').plugin();

飞行重量

// CONFIG is shared
$.fn.plugin = function(CONFIG){
     CONFIG = $.extend({
         content: 'Hello world!'
     }, CONFIG);
     this.html(CONFIG.content);
}

那里的工作很不错:) ..我认为Facade模式$.ajax类似于Template方法模式,因为我们具有基本功能,并且每个其他方法(例如,$.get替代方法)都覆盖了基础并使其更加具体。
Anurag 2010年

4
是的,许多jQuery方法和实际上的JavaScript通常都可以一次符合多种设计模式。这是一般JavaScript的表达能力以及函数式编程如何补充面向对象编程的一个典型示例。=)
BGerrissen

15

复合模式也是jQuery中很常用。与其他库一起工作后,我可以看到这种模式并不像乍看起来那样明显。模式基本上说,

一组对象的处理方式与对象的单个实例相同。

例如,当处理单个DOM元素或一组DOM元素时,可以以统一的方式对待这两个元素。

$('#someDiv').addClass('green'); // a single DOM element

$('div').addClass('green');      // a collection of DOM elements

7

如本文有关YUI所述,如何处理Singleton / Module模式:http: //yuiblog.com/blog/2007/06/12/module-pattern/

我相信jQuery在其核心中使用了这种模式,并鼓励插件开发人员使用该模式。使用此模式是一种方便有效的方法,可以使全局名称空间保持混乱,通过帮助开发人员编写干净的封装代码,该方法将更加有用。


jQuery确实在其核心的各个地方都使用了Module模式,并建议插件开发人员使用它而不是琐碎的插件。很棒的发现:)
Anurag

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.