javascript - 你能让我很容易地理解动态的、抽象的事件对象吗?

标签 javascript event-driven

我使用 MFC 为 GUI 按钮编写了 C++ 事件驱动应用程序,我使用 HTML 事件(如 onmousedown)触发网页中的一些 Javascript。当您使用界面并且事件是硬编码时,事件驱动编程的想法很直观。

我知道如何在 C 中使用函数指针,并且了解 Windows 如何使用它们来运行事件循环。我可以编写代码来动态调用不同的函数。

我的问题是,从编译时转移到运行时。我在这里谈论的是任何语言,但如果您需要一种语言,请选择 Javascript 或 PHP,因为这些天我最常使用它们。我完全不了解如何使用我自己的事件对象来完成某件事。这不是我得到的概念。由于我不使用它们,所以我不知道它们的实际用途是什么。

例如,我想如果我想制作一个自定义的回合制游戏,我可能会使用事件对象来表示一些只需要“发生”的游戏能力的效果。

谁能告诉我自定义事件的简单用法?或者它有用或实用的情况?它是否在很大程度上取决于语言和环境以及事件的处理方式? Javascript 答案会很好,但我阅读了多种语言。

抱歉,我在这方面还不够,需要一些实用的、高级的(中级?)见解。这就像 C 中的指针。我“得到”指针以及它们如何成为你的 friend 。但有一段时间我没有,我认识的很多人仍然没有。一旦你得到它就很简单,我只是不会以这种方式获得自定义的动态事件。

最佳答案

当我们谈论面向事件的编程时,我们通常谈论的是 observer design pattern 的一个或多个实现。 .而观察者设计模式的一个目标就是实现loose coupling。对象之间。

如果没有一个好的例子,那可能并没有多大意义,而且肯定有很多好的例子;我怀疑我的会是其中最好的,但我还是会尝试一下。想象两个物体。一个对象想知道另一个对象什么时候发生了什么事,所以它可以自己做一些事情——也许家里的狗 Rover 想在爸爸下类回家时在门口迎接他。有几种方法可以对这种情况进行编程,对吗?

  • 确保爸爸有对 Rover 的引用,当他回到家时,调用 Rover 的 greetDatAtTheDoor() 方法,或者

  • 给 Rover 一个爸爸的引用, 听爸爸的 onArriveHome 事件, 当它触发时,调用 内部 greetDadAtTheDoor()。

从表面上看,两者之间似乎没有太大区别,但实际上,爸爸对 Rover 的一些实现深信不疑;如果由于某种原因 Rover 的实现必须更改,我们必须在两个地方进行更改:一次在 Rover 中,然后在 Dad 中再次进行更改。也许没什么大不了的,但仍然不理想。

现在想象妈妈也想问候爸爸。而不太喜欢爸爸的猫 Bigglesworth 先生想确保他不在身边,所以他宁愿到外面去。邻居乔想知道爸爸什么时候回家,这样他就可以打扰他爸爸欠他的 20 美元。我们如何解释所有这些情况,以及不可避免地会出现的其他情况?将对妈妈的 greetHusband() 方法、猫的 getOutNow() 方法、狗的 greetDadAtTheDoor() 方法和乔的 goGetMyMoney() 方法的引用放入爸爸的类定义中会很快把爸爸的事情搞砸——而且没有充分的理由,因为所有爸爸自己真正需要做的就是回家。妈妈、狗、猫和邻居只是想在发生这种情况时得到通知,这样他们就可以做他们内部实现需要的任何事情。

不同的语言以不同的方式处理这些东西的细节,但是当你开始谷歌搜索时你会看到,这种模式通常涉及在事件“调度程序”上有一个数组或类似数组的结构(在这个case、Dad——即其他所有人都感兴趣的对象)和“订阅者”(例如,妈妈、猫、Rover 和 Joe)都通过调用调度程序上公开公开的方法并传入来“注册”对自己的引用——以某种形式最终出现在爸爸的“订阅者”数组中的引用。然后,当爸爸回家时,他“发送”了一个事件——“我到家了!”事件,比如说——这本质上是一个函数,它循环遍历他的每个订阅者,并用他们自己的一些可公开访问的方法调用他们——只是它是一个爸爸不知道,也不必知道的方法,因为听众在他/她/它传入时提供了它。

由于最近我碰巧主要编写 ActionScript 代码,所以在我的世界中它可能是这样的——比如说,从我的 Mom 类中声明:

var dad:Dad = new Dad();
dad.addEventListener(DadEvent.ARRIVED_HOME, greetHusbandAtDoor);

private function greetHusbandAtDoor(event:DadEvent):void
{
   // Go greet my husband
}

那么,在爸爸那里,当我回到家时,我所要做的就是:

dispatchEvent(new DadEvent(DadEvent.ARRIVED_HOME));

... 因为 Flash 为我处理了事件分发和通知的细节(再一次,每个人做的有点不同,但在内部,Flash 遵循我描述的概念模型),我爸爸回家了,每个家庭成员会自动执行其注册后执行的操作。

希望这能稍微解释一些事情——事件思维是什么样的,松散耦合意味着什么,为什么它很重要,等等。祝你好运!

关于javascript - 你能让我很容易地理解动态的、抽象的事件对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/471144/

相关文章:

javascript - 根据参数将消息发送到特定 channel

javascript - 如何返回自定义表单字段的值

javascript - 悬停时将一个链接更改为两个

c# - 帮助事件驱动的 TCP 服务器

javascript - 连接模板文字时出现奇怪的错误

java - 我应该为这个 CPU 模拟应用程序使用 Java "worker thread"吗?

apache-kafka - 在 Kafka 中使用事件携带状态传输方法时如何确保一致性

multithreading - 事件驱动和基于线程的服务器系统有什么区别?

c# - Winforms 订阅自己的事件

php - 在 php 中获取我的系统时区