Функции-фабрики
Создавайте объекты с приватным состоянием с помощью замыканий.
«Функции-фабрики» — бесплатный урок JavaScript Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения JavaScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс JavaScript Academy содержит 4 уроков всего.
Что такое фабричная функция
Фабричная функция — это любая функция, возвращающая новый объект. В отличие от конструктора, её вызывают обычным образом, без new, и она может использовать замыкания для хранения приватного состояния.
function createUser(name) {
return {
name,
greet: () => "Hi, I am " + name
};
}
const u = createUser("Ada");
console.log(u.greet()); // "Hi, I am Ada"Без ключевого слова new
Фабричные функции позволяют избежать проблем, связанных с new и this. Достаточно вызвать функцию и получить объект.
function point(x, y) {
return { x, y };
}
const p = point(3, 4);
console.log(p.x, p.y); // 3 4Приватное состояние через замыкание
Переменные, объявленные в фабричной функции, являются приватными. Методы возвращённого объекта замыкают их, как в шаблоне модуля, но создают множество экземпляров.
function createCounter() {
let count = 0; // private
return {
inc: () => ++count,
get: () => count
};
}
const c = createCounter();
c.inc();
console.log(c.get()); // 1Множество независимых экземпляров
Каждый вызов фабричной функции создаёт новый объект с собственным приватным состоянием. В этом заключается главное отличие от модуля-одиночки.
function createCounter() {
let n = 0;
return { inc: () => ++n };
}
const a = createCounter();
const b = createCounter();
console.log(a.inc(), a.inc()); // 1 2
console.log(b.inc()); // 1Вычисляемые свойства
Фабричные функции могут вычислять значения во время создания и предоставлять вычисляемые методы, сохраняя входные данные приватными.
function rectangle(w, h) {
return {
area: () => w * h,
perimeter: () => 2 * (w + h)
};
}
const r = rectangle(3, 4);
console.log(r.area()); // 12
console.log(r.perimeter()); // 14Конфигурация по умолчанию и необязательная конфигурация
Поскольку фабричные функции являются обычными функциями, они удобно обрабатывают значения по умолчанию и параметры с помощью деструктуризации.
function createButton({ label = "OK", disabled = false } = {}) {
return { label, disabled };
}
console.log(createButton()); // { label: "OK", disabled: false }
console.log(createButton({ label: "Go" })); // { label: "Go", disabled: false }Композиция вместо наследования
Фабричные функции отдают предпочтение композиции: объект строится объединением вариантов поведения, а не расширением цепочки классов.
const canFly = (s) => ({ fly: () => s.name + " flies" });
function createBird(name) {
const self = { name };
return Object.assign(self, canFly(self));
}
console.log(createBird("Robin").fly()); // "Robin flies"Общее поведение
Чтобы совместно использовать методы между экземплярами без создания отдельных копий для каждого экземпляра, определите их один раз и присвойте. Или примите небольшие дополнительные затраты ради приватности, которую обеспечивают замыкания.
const behavior = {
describe() { return "id " + this.id; }
};
function createItem(id) {
return Object.assign({ id }, behavior);
}
console.log(createItem(7).describe()); // "id 7"Возврат функций
Фабричная функция может возвращать не объект, а функцию, если это обеспечивает более понятный интерфейс, сохраняя при этом приватное состояние.
function multiplier(factor) {
return (n) => n * factor;
}
const triple = multiplier(3);
console.log(triple(5)); // 15Фабричная функция и конструктор
Конструкторы используют new, this и цепочку прототипов. Фабричные функции проще, позволяют избежать ошибок с this и обеспечивают настоящую приватность с помощью замыканий, но не используют общие методы прототипа.
Проверка при создании
Фабричные функции могут проверять входные данные и выдавать ошибку или нормализовать их перед возвратом, гарантируя, что каждый созданный объект корректен.
function createAge(value) {
if (value < 0) throw new Error("age must be >= 0");
return { value };
}
console.log(createAge(30).value); // 30Быстрая проверка
Фабричные функции.
Повторение
Фабричные функции возвращают объекты без new и this, используя замыкания для приватного состояния. Каждый вызов создаёт независимый экземпляр и поддерживает вычисляемые свойства, конфигурацию по умолчанию, композицию и проверку. В обмен на отказ от общих методов прототипа они дают простоту и настоящую приватность, становясь удобной альтернативой конструкторам на основе замыканий.
Часто задаваемые вопросы
Урок «Функции-фабрики» бесплатный?
Да — полный текст урока «Функции-фабрики» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс JavaScript Academy, подпишись на CoddyKit PRO. Курс JavaScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Функции-фабрики»?
Создавайте объекты с приватным состоянием с помощью замыканий. Ты практикуешь JavaScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать JavaScript Academy?
Предыдущий опыт не требуется. JavaScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Функции-фабрики»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке JavaScript Academy?
Да. Каждый урок JavaScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Как замыкания захватывают состояние
- Приватные переменные с замыканиями
- Модульный шаблон (IIFE)
- Функции-фабрики