0Pricing
JavaScript Academy · Урок

Функции-фабрики

Создавайте объекты с приватным состоянием с помощью замыканий.

«Функции-фабрики» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Как замыкания захватывают состояние
  2. Приватные переменные с замыканиями
  3. Модульный шаблон (IIFE)
  4. Функции-фабрики
← Назад к JavaScript Academy