javascript - 有没有办法用纯 JS 实现 EventTarget?

标签 javascript

我正在尝试(也许是徒劳的)想出一种使用发布-订阅模式的方法,同时a) 使用no 库和b ) 最小化使用它的模块中的样板代码。到目前为止,我想到的最好的是:

var handle = document.createElement();
var unsubscribe = AwesomeModule.subscribe(handle);

handle.addEventListener('awesome', function() {
    console.log('awesome');
});

这会工作得很好,除了使用 AwesomeModule 的人可能会因为必须提供一个不用作元素的随机 DOM 元素而感到困惑。

我尝试了以下方法,但效果不佳:

var handle = Object.create(EventTarget);
var unsubscribe = AwesomeModule.subscribe(handle);

handle.addEventListener('awesome', function(){
    console.log('awesome')
});

我收到 TypeError: Object [object Object] has no method 'addEventListener'。有趣的是,它似乎没有在原型(prototype)链中查找,即使 handle 具有 EventTarget 作为其原型(prototype)。

为什么这行不通?有没有办法用纯 JS 实现 EventTarget?能否在一行代码中完成,而不会吓到 AwesomeModule 的用户?

编辑: 我不知道为什么昨晚我没有想到,但我想 EventTarget 是一个接口(interface)意味着它没有实现代码。令人困惑的是,在 Chrome 调试器控制台中,Object.create(EventTarget) 生成了一个看起来在原型(prototype)链中具有 addEventListener 的对象。也许是在说谎。谁能解释这种行为?谁能解释为什么 W3 选择不让 EventTarget 成为一个具体的“类”?

最佳答案

看来我最初问题的答案是"is"。由于 JavaScript 没有像 Java 这样的继承模型,它会在编译时检查是否合法实现,我想任何对象都可以仅通过具有相同名称的方法来实现接口(interface)。但是,这样做将构成创建一个库,因为 addEventListener 代码未在 EventTarget 中实现(我之前假设它是)。由于似乎没有跨浏览器的方式来获取普通的 EventTarget,我可能会结合自定义事件使用 window.addEventListener。

关于javascript - 有没有办法用纯 JS 实现 EventTarget?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21566615/

相关文章:

javascript - moment 获取本地化的时间段 AM//PM

javascript - JS Lodash : Sort object by value, 最后为空

javascript - 在php中完成表单提交后是否可以重定向回来?

javascript - 我刚刚添加了 var React = require ('react-native' );我的整个构建失败了

javascript - 如何在 ajax header 中为每个用户发送 api token ?

javascript - express.js 在终端中获取 json 文件

javascript - Angular JS 不允许 preventDefault 或 return false 处理表单提交

javascript - Bootstrap Modal 按钮不响应点击

javascript - 动态行创建挖空js

javascript - YUICompressor 或 PHP 中的类似软件?