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线一样。
维基百科的文章很好地涵盖了这个定义。