Я пытаюсь разобраться с композицией объектов и не могу понять, как правильно реализовать то, что делал ранее с помощью ООП. Допустим, у меня есть сущность с тремя свойствами. В ООП я бы создал класс, от которого наследуются все свойства, а через композицию как это сделать?
const Объект = {
данные: {
позиция_x: 0,
позиция_y: 0,
высота: 0
}
}
Нужно ли инициировать эти свойства для каждого нового объекта или существует способ повторного использования? Например:
const ПервыйОбъект = {
состояние: {
позиция_x: 0,
позиция_y: 0,
высота: 0,
параметр1: 0,
параметр2: 0
}
}
const ВторойОбъект = {
состояние: {
позиция_x: 0,
позиция_y: 0,
высота: 0,
свойство1: 0,
свойство2: 0
}
}
Как воплотить это в коде, чтобы избежать дублирования?
Можно использовать замыкания для создания объектов с общими свойствами. Например:
function базовыйОбъект() {
let общиеСвойства = {
позиция_x: 0,
позиция_y: 0,
высота: 0
}
return function(дополнительныеСвойства) {
return {…общиеСвойства, …дополнительныеСвойства}
}
}
const создатьОбъект = базовыйОбъект()
const первыйОбъект = создатьОбъект({параметр1: 0, параметр2: 0})
const второйОбъект = создатьОбъект({свойство1: 0, свойство2: 0})
Так мы избегаем дублирования и легко расширяем объекты. Что думаешь?
при композиции объектов можно использовать фабричные функции для создания объектов с общими свойствами. например:
function создатьБазовыйОбъект() {
return {
позиция_x: 0,
позиция_y: 0,
высота: 0
}
}
const первыйОбъект = {
...создатьБазовыйОбъект(),
параметр1: 0,
параметр2: 0
}
const второйОбъект = {
...создатьБазовыйОбъект(),
свойство1: 0,
свойство2: 0
}
так мы избегаем дублирования кода и можм легко добавлять уникальные свойства для каждого объекта. это более гибкий подхд чем наследование классов.
joem
04.Апрель.2025 01:31:30
4
Для композиции объектов можно использовать Object.create() и миксины. Вот пример:
const базовыйОбъект = {
позиция_x: 0,
позиция_y: 0,
высота: 0
}
const первыйОбъект = Object.create(базовыйОбъект)
первыйОбъект.параметр1 = 0
первыйОбъект.параметр2 = 0
const второйОбъект = Object.create(базовыйОбъект)
второйОбъект.свойство1 = 0
второйОбъект.свойство2 = 0
Так мы создаем объекты с общим прототипом, избегая дублирования. Это гибче чем классы и позволяет легко расширять объекты.