由于原因,我正在寻找定义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
。
要清楚,我知道这个函数是一个原生函数,但我不明白的是,从标准的角度来看,该属性是如何从任何原型中获得的,但在我们需要它时仍然存在
答案 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上的监听器。
EventTarget是由可以接收的对象实现的接口 事件,并可能有他们的听众。
元素,文档和窗口是最常见的事件目标,但 其他对象也可以是事件目标,例如XMLHttpRequest, AudioNode,AudioContext等。
<强>方法强>
EventTarget.addEventListener()注册特定的事件处理程序 EventTarget上的事件类型。 .......... ..........
因此可以在从EventTarget接口(window,document,Element等继承属性的所有接口上调用addEventListener。)。