Javascript 将所有事件从一个对象重定向到另一个对象

Javascript 将所有事件从一个对象重定向到另一个对象,javascript,Javascript,我目前正试图用香草javascript为画布编写一个小型游戏引擎,在我当前的工作模式中,用户将实例化一个场景类,该类将包含所有要渲染的对象及其行为。每个画布一次只有一个活动场景,因此当前未加载的场景处于非活动状态。因此,我希望能够将分派到画布的所有事件重定向到当前活动场景。它看起来像这样: canvas.addEventListener(/* all */, (e) => activeScene.dispatchEvent(e)); 但显然,这是行不通的 这里有一个类似问题的有趣答案:

我目前正试图用香草javascript为画布编写一个小型游戏引擎,在我当前的工作模式中,用户将实例化一个场景类,该类将包含所有要渲染的对象及其行为。每个画布一次只有一个活动场景,因此当前未加载的场景处于非活动状态。因此,我希望能够将分派到画布的所有事件重定向到当前活动场景。它看起来像这样:

canvas.addEventListener(/* all */, (e) => activeScene.dispatchEvent(e));
但显然,这是行不通的

这里有一个类似问题的有趣答案:

这与迭代所有窗口属性以及为所有以“on”开头的属性注册事件侦听器的过程类似

问题是,这不会捕获自定义事件,我希望使用户能够使用从其他地方发送的自定义事件与场景交互(例如,画布上方用于重置当前级别的按钮可能会发送“重置”事件)

备选方案是:

  • 用户在画布上调用自定义函数,然后在当前活动场景中调用相应的函数
  • 用户按照我的想法发送自定义事件,但还必须为该事件类型添加事件侦听器,并手动将事件重定向到活动场景(或者我提供了注册自定义事件并将此类型的事件重定向到活动场景的函数)

  • 在所有这些情况下,对用户来说,这是一个两步的过程。我想在程序开始时只注册一次所有自定义事件不会太糟糕,但我想知道是否存在更优雅的解决方案。

    好的,经过一些修改后,我想到了以下解决方案:

    我使用以下代码使用eventListeners重定向所有标准事件

    for(let key in myObj){
        if(key.startsWith('on')) {
           myObj.addEventListener(key.slice(2), (e) => {otherObj.dispatchEvent(e)});
        }
    }
    
    我将覆盖默认的
    dispatchEvent()
    方法,以便重定向所有手动触发的事件,而不考虑其类型:

    myObj.dispatchEvent = (e) => {otherObj.dispatchEvent(e)};
    

    不幸的是,第一部分是必需的,因为标准事件不是通过
    dispatchEvent()
    方法触发的。理论上,这应该将在对象(在我的例子中是画布)上触发的所有事件重定向到另一个(活动场景)。

    每个场景都可以有自己的画布。显示活动场景的画布,隐藏所有其他画布。@ChrisG我无法理解这将如何解决我的问题。这只会转移问题,我必须有一个全局对象来跟踪活动画布,而不是活动场景(现在是同义词),并将接收到的事件发送到该画布。或者将活动发送到所有的画布,在处理活动之前,他们必须检查自己是否处于活动状态。这是关于另一种方法的建议,这就是为什么我将其作为评论而不是答案发布的原因。让我试试看,然后再给你回复。你能给你的问题添加示例代码,展示引擎用户如何设置,比如说,两个场景吗?是否包括向其添加事件侦听器的用户?我的意思是,假设你已经实现了一个完美的解决方案。在这种情况下,用户的代码会是什么样子?