我有一个用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
任何想法如何实现?谢谢你的任何提示。
我认为你可以在设置真实对象之前返回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)
但是你认为这种优化真的值得吗?
您可以利用JavaScript的原型继承,用现有组件替换继承对象,如下所示:
entity2.component = Object.create(component) // extend the base prototype
entity2.component.data = 'test2' // other components don't inherit this change
请注意,尽管如此,因为您正在使用类(这是对原型继承有点“固执”的语法糖),这种方法可能会以现有代码的方式进行交互。