Ну, в данном случае, есть возможность создавать экземпляры класса с заранее заданным query. Тоже самое конечно можно сделать и через замыкание. Для такого функционала нет необходимости создавать класс, гораздо проще использовать функцию, а query передавать во время вызова функции.
Но когда в вашем классе появится дополнительный функционал, например пагинация, то тут уже будет проще использовать класс, т.к. он проще расширяем. Но если реализовывать пагинацию внутри класса Search, то это уже нарушает принцип единственной ответственности, и я бы вынес функционал пагинации в отдельный класс.
Но если как раз рассматривать саму пагинацию, то там удобнее использовать классы, вот примерно такую структуру я бы создал
(пример на TypeScript)
class Pagination {
private currentPage: number;
private countPages: number;
public goToPage(page: number): void;
public goToNext(): void;
public goToPrev(): void;
// ну, можно всякие геттеры для приватных полей.
}
Можно конечно легко обойтись и функциями, храня поля в замыкании, но тут чисто на любителя, кому-то больше нравится ООП подход, кому-то больше функциональный.