Как передавать переменные с помощью композиции объектов в JavaScript?

Я пытаюсь разобраться с композицией объектов и не могу понять, как правильно реализовать то, что делал ранее с помощью ООП. Допустим, у меня есть сущность с тремя свойствами. В ООП я бы создал класс, от которого наследуются все свойства, а через композицию как это сделать?

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
}

так мы избегаем дублирования кода и можм легко добавлять уникальные свойства для каждого объекта. это более гибкий подхд чем наследование классов.

Для композиции объектов можно использовать Object.create() и миксины. Вот пример:

const базовыйОбъект = {
  позиция_x: 0,
  позиция_y: 0,
  высота: 0
}

const первыйОбъект = Object.create(базовыйОбъект)
первыйОбъект.параметр1 = 0
первыйОбъект.параметр2 = 0

const второйОбъект = Object.create(базовыйОбъект)
второйОбъект.свойство1 = 0
второйОбъект.свойство2 = 0

Так мы создаем объекты с общим прототипом, избегая дублирования. Это гибче чем классы и позволяет легко расширять объекты.