在node.js中使用eventEmitter非常容易:
var e = new EventEmitter();
e.on('happy', function(){console.log('good')});
e.emit('happy');
Run Code Online (Sandbox Code Playgroud)
浏览器原生的任何客户端EventEmitter?
使用jQuery,您可以在任何jQuery对象上使用.on()/ .off()/ .trigger()方法,为您提供对事件系统的强大访问.我正试图在vanilla JavaScript中做类似的事情,但我一直在努力"TypeError: Illegal Invocation".我知道这个错误通常是指this在方法需要时丢失引用.使用.apply或.call似乎通常做的伎俩,但我仍然遇到问题.
具体来说,我正在尝试创建一个启用事件的"类",然后我可以扩展其他类,为我提供了一种在非DOM对象上侦听和触发事件的方法.(是的,我知道JS没有真正的类.我正在使用CoffeeScript,那就是那里使用的语法糖.)这是"类"函数,它创建一个新对象,其属性和值与传递给的对象相同构造函数,并提供了三种方法.apply()的方法从EventTarget.prototype.任何有关如何使这项工作的指导将非常感谢!
EventEnabled = (function() {
function EventEnabled(obj) {
var key, val;
for (key in obj) {
val = obj[key];
this[key] = val;
}
}
EventEnabled.prototype.addEventListener = function() {
return EventTarget.prototype.addEventListener.apply(this, arguments);
};
EventEnabled.prototype.removeEventListener = function() {
return EventTarget.prototype.removeEventListener.apply(this, arguments);
};
EventEnabled.prototype.dispatchEvent = function() {
return EventTarget.prototype.dispatchEvent.apply(this, arguments);
};
return EventEnabled;
})();
Run Code Online (Sandbox Code Playgroud)
当我尝试在EventEnabled的实例上调用这三个方法中的任何一个时,我得到一个"TypeError:Illegal Invocation".
感谢您对此有任何见解!
javascript events javascript-events addeventlistener prototypal-inheritance