CreatePerson: примеры (JAVASCRIPT)

Примеры реализации createPerson для генерации объектов
Раздел: Примеры кода, ООП
createPerson(name: String, age: Number): Object

Основы функции createPerson

Функция createPerson не является встроенной в JavaScript. Часто это пользовательская функция-фабрика или конструктор, используемая для создания однотипных объектов, которые представляют информацию о человеке. Основная цель – инкапсуляция логики создания объекта с заданными свойствами и, возможно, методами.

Обычно функция принимает несколько аргументов для инициализации свойств объекта. Частые параметры:

  • firstName (string): Имя человека.
  • lastName (string): Фамилия человека.
  • age (number): Возраст.
  • isAdmin (boolean): Флаг, указывающий на права администратора (значение по умолчанию часто false).
  • contacts (Array): Массив контактов (например, email, телефон).

Функция возвращает новый объект (экземпляр) с переданными свойствами. Иногда в объект добавляются методы, например, для получения полного имени.

Примеры использования

Пример базовой фабричной функции, создающей объект человека:

function createPerson(firstName, lastName, age, isAdmin = false, contacts = []) {
    return {
        firstName,
        lastName,
        age,
        isAdmin,
        contacts,
        getFullName() {
            return `${this.firstName} ${this.lastName}`;
        }
    };
}

// Пример 1: Создание с минимальными параметрами
const person1 = createPerson('Иван', 'Иванов', 30);
console.log(person1);

// Пример 2: Создание с флагом isAdmin и контактами
const person2 = createPerson('Анна', 'Петрова', 25, true, ['anna@example.com']);
console.log(person2.isAdmin);
console.log(person2.getFullName());
{
  firstName: 'Иван',
  lastName: 'Иванов',
  age: 30,
  isAdmin: false,
  contacts: [],
  getFullName: [Function: getFullName]
}
true
Анна Петрова

Похожие подходы в JavaScript

В JavaScript для создания объектов с одинаковой структурой используют разные методы:

  • Конструктор и оператор new: Классический способ с использованием функции-конструктора. Подходит для случаев, где нужна проверка с помощью instanceof.
  • Классы (ES6+): Синтаксический сахар над конструкторами. Предоставляет более удобный и читаемый синтаксис, особенно для наследования.
  • Object.create(): Создает новый объект с указанным прототипом. Используется для чистого прототипного наследования.
  • Фабричные функции (как createPerson): Просты и гибки, не требуют new, легко комбинируются. Часто предпочтительнее для простых случаев создания объектов без сложной иерархии.

Альтернативы в других языках

В разных языках существуют аналогичные механизмы для создания структур данных, представляющих человека.

Python (использование класса):

class Person:
    def __init__(self, first_name, last_name, age, is_admin=False, contacts=None):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age
        self.is_admin = is_admin
        self.contacts = contacts if contacts else []

    def get_full_name(self):
        return f'{self.first_name} {self.last_name}'

person = Person('Мария', 'Сидорова', 28)
print(person.get_full_name())
Мария Сидорова

PHP (использование класса):

class Person {
    public $firstName;
    public $lastName;
    public $age;
    public $isAdmin;
    public $contacts;

    public function __construct($firstName, $lastName, $age, $isAdmin = false, $contacts = []) {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
        $this->age = $age;
        $this->isAdmin = $isAdmin;
        $this->contacts = $contacts;
    }

    public function getFullName() {
        return $this->firstName . ' ' . $this->lastName;
    }
}

$person = new Person('Дмитрий', 'Козлов', 35);
echo $person->getFullName();
Дмитрий Козлов

Отличие от JavaScript в строгой типизации классов и использовании специального метода-конструктора __construct.

Типичные ошибки

1. Неверный порядок аргументов: Путаница в последовательности параметров может привести к некорректным данным в объекте.

const person = createPerson('Иванов', 'Иван', 30); // Фамилия и имя перепутаны
console.log(person.getFullName());
Иванов Иван // Ожидалось 'Иван Иванов'

2. Мутация вложенных структур: Передача массивов или объектов по ссылке может привести к нежелательному изменению исходных данных.

const myContacts = ['test@mail.ru'];
const person1 = createPerson('А', 'Б', 20, false, myContacts);
const person2 = createPerson('В', 'Г', 22, false, myContacts);

person1.contacts.push('new@mail.ru');
console.log(person2.contacts); // Изменения затронули и второй объект
[ 'test@mail.ru', 'new@mail.ru' ]

3. Использование new с фабричной функцией: Фабричная функция не предназначена для вызова с new.

const person = new createPerson('Елена', 'Смирнова', 27); // Может работать некорректно
console.log(person);

Эволюция подхода

Функция createPerson как пользовательская реализация не имеет фиксированной спецификации. Однако подходы к созданию объектов в JavaScript развивались:

  • С появлением ES6 (2015) стали популярны классы, предлагающие более стандартизированный синтаксис вместо фабричных функций или конструкторов.
  • В ES2015+ также появились параметры по умолчанию, что упростило объявление функций типа createPerson.
  • Современный JavaScript может использовать приватные поля в классах для лучшей инкапсуляции, что сложнее реализовать в простой фабричной функции.

Расширенные примеры

1. Функция с валидацией данных:

Пример javascript
function createPerson(firstName, lastName, age) {
    if (typeof firstName !== 'string' || typeof lastName !== 'string') {
        throw new Error('Имя и фамилия должны быть строками');
    }
    if (typeof age !== 'number' || age < 0) {
        throw new Error('Возраст должен быть положительным числом');
    }
    let _id = Symbol('id'); // Символ для "скрытого" свойства
    return {
        [_id]: Math.random().toString(36).substr(2, 9),
        firstName,
        lastName,
        age,
        introduce() {
            return `Меня зовут ${this.firstName}. Мне ${this.age} лет.`;
        }
    };
}

const p = createPerson('Ольга', 'Волкова', 31);
console.log(p.introduce());
// console.log(p[_id]); // Будет ошибка, символ не доступен вне функции
Меня зовут Ольга. Мне 31 лет.

2. Композиция фабрик для наследования свойств:

Пример javascript
function createEmployee(firstName, lastName, age, position) {
    const person = createPerson(firstName, lastName, age);
    return Object.assign({}, person, {
        position,
        introduce() {
            return `${person.introduce()} Я работаю ${this.position}.`;
        }
    });
}

const emp = createEmployee('Сергей', 'Павлов', 40, 'инженером');
console.log(emp.introduce());
Меня зовут Сергей. Мне 40 лет. Я работаю инженером.

3. Использование замыканий для приватности:

Пример javascript
function createPersonSecure(name, secret) {
    const privateSecret = secret; // Доступно только через методы
    return {
        name,
        revealSecret() {
            return `Мой секрет: ${privateSecret}`;
        }
    };
}

const user = createPersonSecure('Тимофей', 'люблю JavaScript');
console.log(user.name);
console.log(user.revealSecret());
// console.log(user.privateSecret); // undefined
Тимофей
Мой секрет: люблю JavaScript

JS createPerson function comments

En
CreatePerson Example factory function that creates and returns a person object