Umbrella JS — это легковесная библиотека для работы с DOM, предоставляющая удобный и лаконичный API для манипуляции элементами страницы. Одним из важных аспектов её использования является расширение прототипа u(), что позволяет добавлять новые методы, доступные для всех выбранных элементов.
В Umbrella JS все методы работают через объект, возвращаемый функцией
u(selector). Этот объект содержит методы для работы с
DOM-элементами, и новые методы можно добавлять напрямую в
прототип, что обеспечивает единый интерфейс для любых
элементов.
u.extend({
highlight: function(color = 'yellow') {
this.css('background-color', color);
return this;
}
});
В этом примере добавлен метод highlight, который
устанавливает цвет фона выбранных элементов. Ключевой момент: метод
возвращает this, что позволяет сохранять цепочку вызовов
(chaining).
Метод u.extend() позволяет добавлять несколько функций
одновременно. Каждое новое свойство объекта становится методом,
доступным через экземпляры u().
u.extend({
hide: function() {
this.css('display', 'none');
return this;
},
show: function() {
this.css('display', '');
return this;
}
});
После этого можно использовать новые методы для любых элементов:
u('.menu').hide().show();
Методы, добавленные через u.extend(), получают доступ к
текущему набору элементов через this. this
представляет собой массивоподобный объект, содержащий выбранные элементы
DOM. Для итерации по элементам можно использовать встроенный метод
each():
u.extend({
addClassToAll: function(className) {
return this.each(function(el) {
el.classList.add(className);
});
}
});
Метод each() упрощает выполнение операций над всеми
элементами коллекции, сохраняя цепочку вызовов.
Расширяя прототип, можно использовать встроенные методы
библиотеки. Например, метод css() или
attr() можно применять для изменения стилей и атрибутов
элементов.
u.extend({
toggleRed: function() {
return this.each(function(el) {
if (u(el).css('color') === 'red') {
u(el).css('color', '');
} else {
u(el).css('color', 'red');
}
});
}
});
Таким образом, новые методы органично интегрируются с существующими функциями Umbrella JS.
Методы, добавляемые через u.extend(), могут принимать
параметры, аналогично стандартным методам библиотеки. Можно задавать
значения по умолчанию, использовать объекты настроек или функции
обратного вызова:
u.extend({
fade: function(duration = 400) {
return this.each(function(el) {
el.style.transition = `opacity ${duration}ms`;
el.style.opacity = 0;
});
}
});
В этом примере метод fade() плавно скрывает элементы за
указанное время.
Umbrella JS активно использует цепочки вызовов, что особенно важно
при расширении прототипа. Методы должны возвращать this для
сохранения возможности последовательного применения действий:
u('.item')
.highlight('lightblue')
.fade(300)
.addClassToAll('active');
Правильное расширение прототипа обеспечивает компактный и читаемый код.
Для крупных проектов рекомендуется структурировать расширения:
// fadeAndHighlight.js
u.extend({
fadeAndHighlight: function(color = 'yellow', duration = 400) {
return this.fade(duration).highlight(color);
}
});
Это позволяет создавать композиции методов, повышая читаемость и поддерживаемость кода.
Методы можно расширять для работы с событиями:
u.extend({
onClickToggleClass: function(className) {
return this.each(function(el) {
u(el).on('click', function() {
u(el).toggleClass(className);
});
});
}
});
Подобные расширения интегрируются с системой событий Umbrella JS и упрощают добавление интерактивного поведения.
fadeIn, fadeOut,
slideUp, slideDown.toggleActive,
addErrorClass.setDataAttr,
removeAttr.Расширение прототипа Umbrella JS делает библиотеку гибкой, позволяя создавать собственные методы, которые ведут себя так же естественно, как встроенные функции. Такой подход снижает дублирование кода и позволяет выстраивать читаемую и поддерживаемую архитектуру фронтенд-приложений.