Javascript:组合与原型设计

Javascript:组合与原型设计,javascript,html,Javascript,Html,我目前正在用Javascript开发一个小游戏框架,并且已经完成了大部分库和低级内容的准备工作,所以我不会把注意力集中在游戏对象系统上。在我以前的Java游戏框架中,我使用了组合,它工作得非常好,而且我向JS公开了整个对象框架,这一事实激励我从事这个项目。在Java中,组合工作得非常好,因为您不再需要处理类型转换,或者至少很少处理类型转换,所以所有内容都可以通过相同的管道传递 然而,在Javascript中,由于它使您能够动态地向对象添加数据和方法,我想知道是否最好跳过整个组合结构,但这里的主要

我目前正在用Javascript开发一个小游戏框架,并且已经完成了大部分库和低级内容的准备工作,所以我不会把注意力集中在游戏对象系统上。在我以前的Java游戏框架中,我使用了组合,它工作得非常好,而且我向JS公开了整个对象框架,这一事实激励我从事这个项目。在Java中,组合工作得非常好,因为您不再需要处理类型转换,或者至少很少处理类型转换,所以所有内容都可以通过相同的管道传递

然而,在Javascript中,由于它使您能够动态地向对象添加数据和方法,我想知道是否最好跳过整个组合结构,但这里的主要问题是性能。在数组中存储一个对象列表并对其进行迭代(并直接调用它们的方法)速度非常快,而且还具有易于事件传播/冒泡的额外好处,通过原型构建的对象需要运行一个庞大的检查列表,以查看它是否包含各种方法/数据。。我认为对于非实时应用程序,这很好,但当你需要每秒渲染数百个对象30多次时就不行了。我将为这两种设计编写一些测试,但你们有人对此有任何意见吗


注意:这是一个html5框架。

这个问题太宽泛,无法很好地回答。我将尝试将其缩小为两位:

但这里的主要问题是性能

首先,在出现问题后,关注性能

作为一个通过 原型需要通过一个庞大的检查列表来查看 如果它包含各种方法/数据

对两个人来说,这不是真的。您可以很容易地为每个mixin添加一个flag方法——有效地将您的巨大列表压缩为一个且仅一个

例如:

Renderable = {
  isRenderable: true
  // render magic
}

myGameObject.extend(Renderable);
更新

<>你也可能想考虑一个面向事件的方法。这将允许您触发
渲染
事件,并且每个订阅的游戏对象将只渲染自身。没有if语句。类似于(伪的):


+1个有趣的问题,特别是在游戏开发的背景下。lol…u说“这不是真的”,但在中,你似乎与你的代码自相矛盾(如果是可依赖的),所以是的,也许你没有做类型/实例检查,但你仍然显式地做一个if语句。我更喜欢使用显式处理每种类型组件的子系统,这样您就不需要执行显式检查。当然,您仍然希望对对象执行运行时类型检查,以确保它是预期的类型。无论如何,我要做的是混合了复合设计和原型设计,这似乎是最符合逻辑的。例如,组件几乎完全依赖于原型设计,其中作为游戏对象将只包含一个组件列表,可以在对象的整个生命周期中轻松管理。我不确定“lol”是否必要。我只是认为你所说的“巨大列表”意味着你必须对每个游戏对象进行多次检查,看看它是否支持某些行为。我已经更新了我的答案,加入了一种不包含任何if语句的方法,如果这是你关心的话。嘿,迪诺,如果我之前的评论中似乎有讽刺的语气,我很抱歉。您的更新实际上与我现在所做的几乎相同,只有我的游戏对象的渲染组件会在初始化时将自身注册到渲染管理器。
RenderManager.subscribe = function(subscriber) {
    this.subscribers.push(subscriber)
}
RenderManager.render = function() {
    // loop over all subscribers and render with them
}

// when initializing, add game objects to the render system
RenderManager.subscribe(myGameObject);

// then from your main game loop
RenderManager.render();