具有组件原型的实体组件系统

时间:2018-12-01 16:12:14

标签: javascript components entity ecmascript-2017

我有一个用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

任何想法如何实现?谢谢您的提示。

2 个答案:

答案 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

请注意,由于您使用的是类(在原型继承上有点“花哨”的语法糖),因此该方法可能会与您的现有代码以分阶段的方式进行交互。