2

澄清:

我只针对支持 createEvent、addEventListener 等的现代浏览器......

问题

我的意思是原生的,在 JavaScript 中。搜索显示他们没有使用createEvent().

我在文档中寻找答案,但没有找到任何答案。

createEvent()我在这里的中进行了搜索,但没有命中。

骨干如何从母语角度实现事件?

他们是否使用观察者模式

如果 JavaScript 已经有自定义事件( via createEvent())可用,并且事件监听器也可用(addEventListener()为什么不使用内置事件?

4

2 回答 2

8

为什么 Backbone 不使用原生事件?

将本机事件用于除了主干视图之外的任何东西都没有任何意义。Backbone 为模型集合一般情况下提供事件管理。

本机事件(通过createEvent, addEventListener)绑定到 DOM 节点。模型和集合与 DOM 节点无关——您必须跳过许多不必要的障碍才能重用该代码。

Backbone 事件是否遵循观察者模式?

不是真的,不。 Backbone.Events更接近发布-订阅模式。一个对象维护一个命名事件的事件侦听器列表(通过on),然后该对象trigger在它想要触发事件时触发对这些侦听器的调用。

Backbone 事件是如何实现的?

在其核心,Backbone 为每个事件维护一组事件侦听器(在旧版本的主干中,它曾经使用链表;这更慢)。每个对象都维护自己的侦听器列表;没有中央登记处。

On trigger,主干调用为该事件注册的所有侦听器;它还为特殊all事件调用任何侦听器。

于 2013-01-24T22:19:24.833 回答
1

Backbone 就是这样做的。这是 163 行代码,包括空格和注释。

澄清如何

  • 基本的东西,如用于拆分事件名称的正则表达式、绑定侦听器的简单注册表,这些侦听器是简单的对象文字
  • on|bind, off|unbind, trigger, once, listenTo,的 apistopListening

至于为什么,这是基于作者和贡献者做出的设计决策,他们觉得适合项目的目标和风格。考虑到主干模型、集合和视图使用的常见模式,命名空间和多事件绑定是很好的便利。

的,他们正在使用观察者模式。所有基于事件的系统都包含观察者模式的实现。从广义上讲,事件、pub/sub 和观察者是同义词,尽管有些人可能会发现在详细讨论时区分它们很重要。

于 2013-01-24T22:17:39.283 回答