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

问题描述 投票:0回答:1

我有一个用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 components entity ecmascript-2017
1个回答
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)

但是你认为这种优化真的值得吗?


0
投票

您可以利用JavaScript的原型继承,用现有组件替换继承对象,如下所示:

entity2.component = Object.create(component) // extend the base prototype
entity2.component.data = 'test2' // other components don't inherit this change

请注意,尽管如此,因为您正在使用类(这是对原型继承有点“固执”的语法糖),这种方法可能会以现有代码的方式进行交互。

© www.soinside.com 2019 - 2024. All rights reserved.