哪个对象“持有”addEventListener?

时间:2016-02-05 11:37:59

标签: javascript

由于原因,我正在寻找定义XMLHttpRequest的源对象。从> Object.prototype.hasOwnProperty(XMLHttpRequest.prototype, 'addEventListener') false > XMLHttpRequest.prototype.__proto__ XMLHttpRequestEventTarget {} > Object.prototype.hasOwnProperty(XMLHttpRequestEventTarget.prototype, 'addEventListener') false > XMLHttpRequestEventTarget.prototype.__proto__ EventTarget {} > Object.prototype.hasOwnProperty(EventTarget.prototype, 'addEventListener') false > EventTarget.prototype.__proto__ Object {} 开始,我发现了以下内容:

addEventListener

怎么可能?似乎没有在任何原型中定义fragments

要清楚,我知道这个函数是一个原生函数,但我不明白的是,从标准的角度来看,该属性是如何从任何原型中获得的,但在我们需要它时仍然存在

2 个答案:

答案 0 :(得分:3)

DOM 接口很复杂。它们被指定为接口(在这种情况下为EventTarget),但必须在每个"类"上实现这些方法。或原型分开,因为JS没有多个继承或接口。确切的继承层次可能因浏览器及其版本而异。

在您的示例中,addEventListener实际上是在XMLHttpRequest原型上实现的(至少在我的Opera中),只是您检查错了:

// Opera 12
XMLHttpRequest.prototype.hasOwnProperty("addEventListener") // true
Object.prototype.hasOwnProperty.call(XMLHttpRequest.prototype,  "addEventListener") // true
//                              ^^^^
Object.prototype.isPrototypeOf(XMLHttpRequest.prototype) // true - flat hierarchy

// Chrome 48
EventTarget.prototype.hasOwnProperty("addEventListener") // true
XMLHttpRequest.prototype instanceof EventTarget // true - some indirection

答案 1 :(得分:0)

EventTarget 原型持有该属性:

console.log(EventTarget.prototype.hasOwnProperty('addEventListener'))
// true

看看Mozilla MDN: EventTarget.addEventListener()

  

EventTarget.addEventListener()方法注册指定的   它被调用的EventTarget上的监听器。

来自Mozilla MDN: EventTarget

  

EventTarget是由可以接收的对象实现的接口   事件,并可能有他们的听众。

     

元素文档窗口是最常见的事件目标,但   其他对象也可以是事件目标,例如XMLHttpRequest,   AudioNode,AudioContext等。

     

<强>方法

     

EventTarget.addEventListener()注册特定的事件处理程序   EventTarget上的事件类型。   ..........   ..........

因此可以在从EventTarget接口(windowdocumentElement等继承属性的所有接口上调用addEventListener。)。