Цепочки вызовов методов (method chaining) в библиотеке Cash строятся вокруг идеи возвращать сам объект-коллекцию после каждого вызова. Это позволяет последовательно применять множество операций к одному и тому же набору элементов, избавляясь от промежуточных переменных и повышая читабельность кода.
Каждый метод, работающий над выбранными элементами, возвращает объект Cash. Благодаря этому возможно продолжить вызовы, например:
$('.item')
.addClass('active')
.attr('data-state', 'selected')
.css('opacity', 0.8);
С точки зрения API это достигается тем, что внутренние функции изменения состояния либо данных не прерывают поток, а завершают выполнение возвратом текущей коллекции. Даже методы, не меняющие DOM, но вычисляющие некоторую информацию, стремятся сохранять однотипное поведение, чтобы цепочка не обрывалась.
Cash всегда оперирует коллекциями DOM-элементов, позволяя циклически
применять методы ко всем элементам в цепочке. Например, методы
addClass, removeClass,
toggleClass, css, attr и многие
другие обрабатывают каждый элемент коллекции, но при этом возвращают
объект Cash целиком. Именно это делает цепочки вызовов естественными:
изменяется не один элемент, а набор.
Важный аспект заключается в том, что порядок вызовов влияет на
комбинацию изменений. Например, применение css перед
addClass может привести к отличающемуся визуальному
результату по сравнению с обратным порядком, если классы переопределяют
свойства, установленные через CSS-метод.
Некоторые методы возвращают примитивные значения (например, строку или число) или DOM-объекты. Такие методы фактически завершают цепочку Cash, так как возвращаемое значение уже не является объектом Cash. Пример:
const height = $('.box').height();
После вызова height() цепочка не может быть продолжена,
поскольку вместо коллекции возвращается число. Это удобное поведение, но
при построении комплексных цепочек следует учитывать, какие вызовы
остаются в пространстве Cash, а какие выводят наружу.
Цепочки позволяют объединять чтение и запись свойств в одном компактном участке кода. Пример типичной последовательности:
$('.button')
.addClass('loading')
.attr('disabled', true)
.html('Ожидание')
.on('click', handler);
Запись атрибута disabled, изменение HTML-содержимого и
установка обработчика события логически принадлежат одному объекту,
поэтому объединение их в цепочку не только сокращает код, но и
структурирует его по смыслу.
Особую выразительность цепочки приобретают при использовании
селекторов, отбирающих элементы по ходу выполнения. Например, метод
find позволяет дополнительно фильтровать коллекцию и
продолжить работу уже с новым набором элементов:
$('.list')
.find('li.active')
.css('font-weight', 'bold');
Для поддержания унифицированного интерфейса методы, ориентированные на изменение, возвращают объект Cash, а методы чтения — данные. Эта логика делает API предсказуемым: любое действие, изменяющее DOM, скорее всего останется в цепочке, а извлекающее — завершит ее. Внутри реализации Cash это достигается путем проверки переданных аргументов: если аргументы отсутствуют — считается, что происходит чтение, при наличии аргументов — запись.
Например, метод attr при вызове без второго аргумента
возвращает значение атрибута первого элемента коллекции, а при двух
аргументах устанавливает атрибут для всех элементов и возвращает объект
Cash. Такое поведение позволяет объединять разные сценарии:
const current = $('.card').attr('data-id');
$('.card')
.attr('data-id', current + '-updated')
.addClass('modified');
Цепочки вызовов задают стиль объявления последовательных операций над DOM. При этом увеличивается плотность кода: несколько действий укладываются в короткую вертикальную структуру. Наличие цепочек стимулирует группировать логически связанные изменения, снижая фрагментацию логики.
Однако чрезмерно длинные цепочки могут снижать прозрачность происходящего. Поэтому удобно разделять цепочки по смысловым блокам — например, одна цепочка для визуальных изменений, другая для событий и данных. Такой подход улучшает читаемость, сохраняя преимущества цепочек.
Хотя Cash не добавляет специальных механизмов для асинхронного управления, цепочки часто применяются перед вызовами, запускающими асинхронные процессы. Например, перед началом запроса к серверу интерфейс может обновляться через цепочку, а после завершения запроса — снова через цепочку. Это выстраивает единообразие в способах выражения изменений интерфейса.
Цепочки Cash легко сочетаются с доступом к нативным DOM-методам.
Например, результаты отдельных вызовов можно извлечь и передать в другие
системы. При этом сам Cash предоставляет методы вроде get,
возвращающие сырые DOM-элементы из коллекции, что естественным образом
разрывает цепочку и позволяет перейти к низкоуровневой работе.
Композиция цепочек Cash с цепочками других библиотек может происходить через чёткие точки перехода: например, получение значения через метод чтения и передача его в чужой API, либо наоборот — получение нативных данных извне и использование Cash для отображения изменений.
Цепочки Cash представляют собой композицию примитивных операций, превращенную в линейный поток изменений над коллекцией элементов. Ключевой принцип — максимальная гладкость переходов между методами, при которой не требуется лишних присваиваний, промежуточных переменных и повторных выборок DOM. Благодаря этому подходу Cash предоставляет лаконичный и выразительный стиль работы с DOM, близкий по духу jQuery, но лаконичнее и легче встраиваемый в современные кодовые базы.