Система Entity Component с прототипами компонентов

У меня есть система компонентов сущности, написанная на 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

Есть идеи, как этого добиться? Спасибо за любые подсказки.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
176
2

Ответы 2

Я думаю, вы можете вернуть объект 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

Однако будьте осторожны, поскольку вы используете классы (которые являются несколько «самоуверенным» синтаксическим сахаром по сравнению с прототипным наследованием), этот метод потенциально может странным образом взаимодействовать с вашим существующим кодом.

Другие вопросы по теме