gpt4 book ai didi

ActionScript 3 EventDispatcher 的 Javascript 实现

转载 作者:行者123 更新时间:2023-11-30 13:30:16 28 4
gpt4 key购买 nike

我正在将一个 ActionScript 应用程序移植到 JavaScript,并且正在尝试完善我的 EventDispatcher 实现。

我最近遇到的一个问题是,我附加的回调没有被正确的 this 值调用。我暂时修复它的方法是将第三个参数添加到 addEventListener 并返回上下文,但这并不理想,因为它不匹配与 actionscript 等价物相同的原型(prototype)。

我尝试的另一件事是 this.callback 风格的函数,但它有更多问题,尤其是 removeEventListener

有没有办法在 Javascript 中遵循 ActionScript 的事件样式?

我当前的实现附在下面:(取决于 jQuery/jQueryMX)

var EventDispatcher = jQuery.Class.extend({
listeners: {},
init: function() {
this.listeners = {};
},
addEventListener: function(event, listener, context) {
if (this.listeners.hasOwnProperty(event)) {
this.listeners[event].push([listener,context]);
} else {
this.listeners[event] = [[listener,context]];
}
},
hasEventListener: function() {
console.error('hasEventListener unimplemented', arguments);
},
removeEventListener: function(event, listener) {
if (this.listeners.hasOwnProperty(event)) {
for (i in this.listeners[event]) {
if (this.listeners[event][i][0] == listener) {
this.listeners[event].splice(i,1);
return true;
}
}
} else {
//console.log('no listener found for',event,listener,this);
return false;
}
},
dispatchEvent: function(event) {
if (event.type && this.listeners.hasOwnProperty(event.type)) {
event.currentTarget = this;
//console.log('dispatchEvent',event,this);
for (i in this.listeners[event.type]) {
if (typeof this.listeners[event.type][i][0] == 'function') {
this.listeners[event.type][i][0].call(this.listeners[event.type][i][1],event);
}
}
}
}
});

最佳答案

Actionscript 3 和 Javascript 是根本不同的语言。您可能会在 addEventListener 函数中使用 arguments.callee 并获得某种 AS3 EventDispatcher 接口(interface)的近似值,但鉴于两种语言之间的内在差异,不可能(或不希望)完全匹配它。我们通常在 AS3 中使用 EventDispatcher 的方式依赖于 Bound Method 的概念。 ,这在 Javascript 中根本不存在。

我想说您当前的实现不仅正确,而且比您一直追求的更强大、更安全。通过传递和存储每个事件监听器的上下文,您不断提醒自己您使用的是 Javascript,而不是 actionscript,并且您避免了整个类别的陷阱,这些陷阱伴随着忽略 Javascript 的函数范围和AS3 的

关于ActionScript 3 EventDispatcher 的 Javascript 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7026709/

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