gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:47:09 28 4
gpt4 key购买 nike

我正在尝试(也许是徒劳的)想出一种使用发布-订阅模式的方法,同时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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com