Slim.js — это легковесная библиотека для создания веб-компонентов на JavaScript, ориентированная на декларативное описание UI и реактивное обновление данных. Одной из ключевых особенностей является возможность управления доступом к методам компонентов через приватные и публичные методы.
Публичные методы доступны извне компонента, то есть они могут быть вызваны из других компонентов или через DOM-элементы, на которых инстанцирован компонент. Объявляются они как обычные функции внутри класса компонента, без специальных модификаторов.
Пример объявления публичного метода:
class MyComponent extends Slim {
constructor() {
super();
this.name = "Slim.js";
}
greet() {
console.log(`Hello from ${this.name}`);
}
}
Slim.define('my-component', MyComponent);
// Вызов извне:
const elem = document.querySelector('my-component');
elem.greet(); // Hello from Slim.js
Особенности публичных методов:
Приватные методы предназначены для внутренней логики компонента. Они недоступны извне и помогают инкапсулировать поведение, предотвращая случайное вмешательство из других частей приложения.
В Slim.js приватные методы объявляются с использованием синтаксиса
#, что соответствует современным стандартам ECMAScript для
приватных полей и методов.
Пример приватного метода:
class MyComponent extends Slim {
constructor() {
super();
this.counter = 0;
}
increment() {
this.#increaseCounter();
}
#increaseCounter() {
this.counter++;
console.log(`Counter: ${this.counter}`);
}
}
Slim.define('my-component', MyComponent);
const elem = document.querySelector('my-component');
elem.increment(); // Counter: 1
// elem.#increaseCounter(); // Ошибка: приватный метод недоступен
Ключевые моменты приватных методов:
#.Часто публичные методы вызывают приватные для выполнения внутренней логики. Это позволяет создать интерфейс компонента для внешнего мира, оставляя внутренние процессы скрытыми.
Пример комплексного использования:
class TimerComponent extends Slim {
constructor() {
super();
this.seconds = 0;
this.intervalId = null;
}
start() {
if (!this.intervalId) {
this.#runTimer();
}
}
stop() {
clearInterval(this.intervalId);
this.intervalId = null;
}
#runTimer() {
this.intervalId = setInterval(() => {
this.seconds++;
console.log(`Time: ${this.seconds}s`);
}, 1000);
}
}
Slim.define('timer-component', TimerComponent);
const timer = document.querySelector('timer-component');
timer.start(); // запускает таймер
timer.stop(); // останавливает таймер
Здесь #runTimer является приватным методом,
обеспечивающим работу таймера, а публичные методы start и
stop управляют его запуском и остановкой.
Slim.js поддерживает реактивные данные, и публичные методы могут взаимодействовать с реактивными свойствами. Приватные методы часто используются для обновления этих свойств без внешнего вмешательства.
class CounterComponent extends Slim {
constructor() {
super();
this.count = 0;
}
increment() {
this.#updateCount();
}
#updateCount() {
this.count++;
this.update(); // обновление шаблона Slim
}
}
Slim.define('counter-component', CounterComponent);
Вызов публичного метода increment безопасно увеличивает
счетчик через приватный метод #updateCount, скрывая детали
реализации обновления состояния.
Приватные и публичные методы в Slim.js формируют основу правильной архитектуры компонента, позволяя отделять внутреннюю реализацию от внешнего интерфейса, улучшая поддержку и масштабируемость кода.