Patrones de diseño utilizados en la biblioteca jQuery

78

jQuery está muy centrado en DOM y proporciona una buena abstracción a su alrededor. Al hacerlo, hace uso de varios patrones de diseño bien conocidos que me golpearon ayer. Un ejemplo obvio sería el patrón Decorator . El objeto jQuery proporciona una funcionalidad nueva y adicional en torno a un objeto DOM normal.

Por ejemplo, el DOM tiene un método insertBefore nativo pero no hay un método insertAfter correspondiente. Hay varias implementaciones disponibles para llenar este vacío, y jQuery es una de esas bibliotecas que proporciona esta funcionalidad:

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

Hay muchos otros ejemplos del patrón Decorator que se usa mucho en jQuery.

¿Qué otros ejemplos, grandes o pequeños, de patrones de diseño ha notado que forman parte de la propia biblioteca? Además, proporcione un ejemplo del uso del patrón.

Haciendo de esto una wiki comunitaria, creo que varias cosas que a la gente le encanta de jQuery se remontan a patrones de diseño bien conocidos, solo que no se les suele llamar por el nombre del patrón. No hay una respuesta única a esta pregunta, pero catalogar estos patrones proporcionará una visión útil de la biblioteca en sí.

Anurag
fuente

Respuestas:

96

Inicialización diferida:

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

Adaptador o envoltorio

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

Fachada

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

Observador

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

Iterador

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

Estrategia

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

Apoderado

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

Constructor

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

Prototipo

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

Peso mosca

// CONFIG is shared
$.fn.plugin = function(CONFIG){
     CONFIG = $.extend({
         content: 'Hello world!'
     }, CONFIG);
     this.html(CONFIG.content);
}
BGerrissen
fuente
Buen trabajo allí :) .. Creo que el patrón de Fachada se $.ajaxparece al patrón del método Plantilla, ya que tenemos una funcionalidad básica, y cada método adicional, como $.getanula la base y lo hace más específico.
Anurag
4
Sí, muchos métodos de jQuery y, de hecho, JavaScript en general pueden cumplir con una gran cantidad de patrones de diseño a la vez. Es un excelente ejemplo del poder expresivo de JavaScript en general y cómo la programación funcional puede complementar la programación orientada a objetos. =)
BGerrissen
15

El patrón compuesto también se usa con mucha frecuencia en jQuery. Habiendo trabajado con otras bibliotecas, puedo ver cómo este patrón no es tan obvio como parece a primera vista. El patrón básicamente dice que

un grupo de objetos debe tratarse de la misma manera que una sola instancia de un objeto.

Por ejemplo, cuando se trata de un solo elemento DOM o un grupo de elementos DOM, ambos pueden tratarse de manera uniforme.

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

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

¿Qué tal el patrón Singleton / Module, como se explica en este artículo sobre YUI: http://yuiblog.com/blog/2007/06/12/module-pattern/

Creo que jQuery usa este patrón en su núcleo, además de alentar a los desarrolladores de complementos a usar el patrón. El uso de este patrón es una forma práctica y eficaz de mantener el espacio de nombres global libre de desorden, lo que es más útil al ayudar a los desarrolladores a escribir código encapsulado y limpio.

Ender
fuente
jQuery usa el patrón Module en varios lugares de su núcleo, y también lo recomienda para desarrolladores de complementos para complementos más que triviales. Gran hallazgo :)
Anurag
2

A los ojos de la programación funcional, jQuery es una Mónada. Una mónada es una estructura que pasa un objeto a una acción, devuelve el objeto modificado y lo pasa a la siguiente acción. Como una cadena de montaje.

El artículo de Wikipedia cubre muy bien la definición.

nimrod
fuente
¡Creo que aquí mónada significa la capacidad de encadenamiento de la biblioteca!
Jebin
Eso es exactamente lo que estoy describiendo aquí.
Julian Krispel-Samsel