У меня есть система компонентов сущности, написанная на ES7. Я хотел бы минимизировать использование памяти. Поскольку многие из этих сущностей в системе очень похожи, они используют ссылки на «одинаковые» компоненты. Я называю их прототипы компонентов.
Однако есть проблема. Я хочу иметь возможность изменять данные компонентов для одной сущности, не затрагивая другие сущности.
У них одна и та же ссылка на объект компонента. Я понимаю, что мне нужно будет сделать копию данных и изменить ссылку компонента на эту копию, когда я захочу внести изменения в общий компонент, но я хотел бы сделать это автоматически.
class Entity {
// get component // prop getter - read from reference
// set component // clone the data
}
class Component {
data = 'test'
}
let component = new Components()
let entity1 = new Entity()
let entity2 = new Entity()
entity1.component = component
entity2.component = component // shared entity
entity2.component.data = 'test2' // now the entity should clone the componentЕсть идеи, как этого добиться? Спасибо за любые подсказки.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю, вы можете вернуть объект defaultComponent до того, как будет установлен реальный
const defaultComponent = {
foo: 'bar',
x: 1,
y: 1
}
class Test {
get component() {
return this._component || defaultComponent
}
set component(c) {
this._component = c
}
}
const a = new Test()
console.info(a.component)
a.component = { ...defaultComponent }
a.component.x = 3
a.component.foo = 'derp'
console.info(a.component)Но считаете ли вы, что такая оптимизация действительно того стоит?
Вы можете использовать прототипное наследование JavaScript, заменив существующий компонент наследуемым объектом, например:
entity2.component = Object.create(component) // extend the base prototype
entity2.component.data = 'test2' // other components don't inherit this change
Однако будьте осторожны, поскольку вы используете классы (которые являются несколько «самоуверенным» синтаксическим сахаром по сравнению с прототипным наследованием), этот метод потенциально может странным образом взаимодействовать с вашим существующим кодом.