Javascript 对addEventListener的非法调用

Javascript 对addEventListener的非法调用,javascript,events,javascript-events,addeventlistener,prototypal-inheritance,Javascript,Events,Javascript Events,Addeventlistener,Prototypal Inheritance,使用jQuery,您可以在任何jQuery对象上使用.on()/.off()/.trigger()方法,使您能够强大地访问事件系统。我试图在vanilla JavaScript中执行类似的操作,但我一直遇到“TypeError:非法调用”。我知道这个错误通常是指当方法需要一个this引用时,会丢失它。使用.apply或.call似乎通常能奏效,但我仍然遇到问题 具体地说,我正在尝试创建一个启用事件的“类”,然后我可以从中扩展其他类,为我提供一种方法来侦听和触发非DOM对象上的事件。(是的,我知道

使用jQuery,您可以在任何jQuery对象上使用
.on()
/
.off()
/
.trigger()
方法,使您能够强大地访问事件系统。我试图在vanilla JavaScript中执行类似的操作,但我一直遇到
“TypeError:非法调用”
。我知道这个错误通常是指当方法需要一个
this
引用时,会丢失它。使用
.apply
.call
似乎通常能奏效,但我仍然遇到问题

具体地说,我正在尝试创建一个启用事件的“类”,然后我可以从中扩展其他类,为我提供一种方法来侦听和触发非DOM对象上的事件。(是的,我知道JS没有真正的类。我使用的是CoffeeScript,这是这里使用的语法糖。)下面是“class”函数,它创建一个新对象,该对象的属性和值与传递给构造函数的对象的属性和值相同,并提供三个方法,分别是
.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;

})();
当我尝试在EventEnabled的实例上调用这三个方法中的任何一个时,我会得到一个“TypeError:非法调用”


感谢您对这方面的任何见解

EventTarget
只是在本机DOM对象上实现的构造函数,而不是javascript可用的构造函数。虽然它可能在全局范围内可用,但不能用于实例化它的实例


此外,您只能将其方法应用于本机实现该接口的对象(如DOM元素),而不能应用于
EventEnabled
构造函数的任意实例。您需要创建一个内部节点,或者需要实现自己的事件调度系统(如果您不想使用许多可用库中的任何一个)。

addEventListener
(和朋友们)希望您将DOM元素作为
this
传递,不是
EventEnabled
类的实例。您如何创建
EventEnabled
的实例?你在传递构造函数什么?你如何调用
addEventEnabled
addEventListener
方法?@RocketHazmat RE:第一个评论我只是希望它没有被强制执行,但如果是这样的话,那我就倒霉了。RE:第二条注释实例化和调用如下:
var eventedObj=new EventEnabled(obj);addEventListener(“customEvent”,函数(事件){console.log(event);},false)是的,您只能对DOM元素调用
addEventListener
。jQuery允许您将事件“绑定”到任何jQuery对象,但这是因为它只是将函数存储在实例中,并在触发时调用它。它只对DOM元素使用
addEventListener
。@RocketHazmat,我明白了,这很不幸。是的,当我将jQuery/vanilla事件监听器混用为时,我注意到了一些奇怪的事情。我想我会想出一些其他的方法,谢谢你的帮助。