CreatePerson: примеры (JAVASCRIPT)
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. Функция с валидацией данных:
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. Композиция фабрик для наследования свойств:
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. Использование замыканий для приватности:
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