jQuery库中使用的devise模式

jQuery高度专注于DOM,并提供了一个很好的抽象。 在这样做的时候,它利用了昨天刚刚打到我的各种众所周知的devise模式 。 一个明显的例子是装饰者模式。 jQuery对象在常规的DOM对象周围提供了新的和附加的function。

例如,DOM有一个原生的insertBefore方法,但没有相应的insertAfter方法。 有各种各样的实现可以填补这个空白,而jQuery就是这样一个提供这种function的库:

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

jQuery中还有许多其他的Decorator模式的例子。

还有什么样的devise模式的大或小的例子,你注意到它们是图书馆本身的一部分吗? 另外,请提供一个模式用法的例子。

使之成为一个社区维基,因为我相信人们喜欢jQuery的各种东西可以追溯到众所周知的devise模式,只是它们通常不被模式名称所引用。 这个问题没有一个答案,但编目这些模式将提供一个有用的洞察到图书馆本身。

延迟初始化:

 $(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); } 

Composite模式在jQuery中也很常用。 和其他图书馆一起工作之后,我可以看到这种模式并不像一见钟情那么明显。 该模式基本上说,

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

例如,在处理单个DOM元素或一组DOM元素时,可以统一处理两者。

 $('#someDiv').addClass('green'); // a single DOM element $('div').addClass('green'); // a collection of DOM elements 

如何在这篇关于YUI的文章中讨论Singleton / Module模式:http: //yuiblog.com/blog/2007/06/12/module-pattern/

我相信jQuery在其核心中使用这种模式,并鼓励插件开发人员使用这种模式。 使用这种模式是保持全局名称空间不受干扰的方便高效的方式,这通过协助开发人员编写干净的,封装的代码来进一步有用。

在函数式编程的眼中,jQuery是一个Monad。 Monad是一个将对象传递给动作的结构,返回修改的对象并将其传递给下一个动作。 像assembly线一样。

维基百科的文章很好地涵盖了这个定义。