我有一个用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
任何想法如何实现?谢谢您的提示。
答案 0 :(得分:0)
我认为您可以在设置真实对象之前返回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.log(a.component)
a.component = { ...defaultComponent }
a.component.x = 3
a.component.foo = 'derp'
console.log(a.component)
但是您认为这种优化真的值得吗?
答案 1 :(得分:0)
您可以利用JavaScript的原型继承,将现有组件替换为继承对象,如下所示:
entity2.component = Object.create(component) // extend the base prototype
entity2.component.data = 'test2' // other components don't inherit this change
请注意,由于您使用的是类(在原型继承上有点“花哨”的语法糖),因此该方法可能会与您的现有代码以分阶段的方式进行交互。