Шаблони дизайну, що використовуються в бібліотеці jQuery


78

jQuery дуже зосереджений на DOM і забезпечує приємну абстракцію навколо нього. Роблячи це, він використовує різні відомі шаблони дизайну, які щойно мене вразили. Одним з очевидних прикладів може бути шаблон " Декоратор" . Об'єкт jQuery надає нову та додаткову функціональність навколо звичайного об'єкта DOM.

Наприклад, DOM має власний метод insertBefore, але не існує відповідного методу insertAfter. Для заповнення цієї прогалини доступні різні реалізації , і jQuery - це одна з таких бібліотек, яка забезпечує цю функціональність:

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

Існує безліч інших прикладів того, як візерунок Декоратор активно використовується в jQuery.

Які ще, великі чи малі, приклади зразків дизайну ви помічали і є частиною самої бібліотеки? Також, будь ласка, надайте приклад використання шаблону.

Створення цієї вікі-спільноти, оскільки я вважаю, що різні речі, які люди люблять у jQuery, можна простежити до добре відомих шаблонів дизайну, просто їх не називають іменем шаблону. На це запитання немає однозначної відповіді, але каталогізація цих зразків дасть корисне уявлення про саму бібліотеку.

Відповіді:


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

хороша робота там :) .. Я думаю, що шаблон фасаду $.ajaxнагадує шаблон шаблону методу, оскільки ми маємо базову функціональність, і кожен додатковий метод, наприклад, $.getзамінює базу і робить її більш конкретною.
Анураг,

4
Так, багато методів jQuery і насправді JavaScript загалом можуть відповідати безлічі шаблонів дизайну одночасно. Це яскравий приклад виражальної сили JavaScript загалом і того, як функціональне програмування може доповнити об’єктно-орієнтоване програмування. =)
BGerrissen 02

15

Композитні моделі також дуже часто використовуються в JQuery. Працюючи з іншими бібліотеками, я бачу, як ця закономірність не така очевидна, як виглядає на перший погляд. Шаблон в основному говорить, що,

з групою об'єктів слід поводитися так само, як з окремим екземпляром об'єкта.

Наприклад, коли йдеться про один елемент DOM або групу елементів DOM, обидва вони можуть бути оброблені однаково.

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

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

7

Як щодо шаблону Singleton / Module, як обговорюється в цій статті про YUI: http://yuiblog.com/blog/2007/06/12/module-pattern/

Я вважаю, що jQuery використовує цей шаблон у своєму ядрі, а також заохочує розробників плагінів використовувати цей шаблон. Використання цього шаблону - зручний та ефективний спосіб уникнути безладу в глобальному просторі імен, що додатково корисно, допомагаючи розробникам писати чистий інкапсульований код.


jQuery використовує шаблон модуля в різних місцях свого ядра, а також рекомендує його розробникам плагінів для більш ніж тривіальних плагінів. Чудова знахідка :)
Анураг

2

З огляду на функціональне програмування, jQuery - це Монада. Монада - це структура, яка передає об'єкт дії, повертає модифікований об'єкт і передає його наступній дії. Як конвеєр.

Стаття у Вікіпедії дуже добре висвітлює це визначення.


Я думаю, що монада тут означає ланцюгову здатність бібліотеки!
Jebin

Саме це я тут описую.
Джуліан Криспель-Самсель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.