如何在JavaScript中扩展XMLHttpRequest对象?

4
我希望扩展现有的XMLHttpRequest对象,使其能够与所有浏览器兼容。我已经了解了JS继承等相关知识,但在开始之前,我想看到一个好的例子。
HTML5具有上传和进度事件功能,我想在继承的新对象中实现这些功能,即使该功能不受支持,也不会在客户端引入JS错误。因此,我希望实现类似于以下内容的功能:
Class XMLHttpRequest{}
Class UploadXMLHttpRequest: XMLHttpRequest{}

可以像以下这样将其他方法附加到UploadXMLHttpRequest类中。

UploadXMLHttpRequest.prototype.uploadFile = function(file){

}

考虑到 YUI、jQuery 等在市场上很受欢迎,但没有人真正想做这些,这让我很难找到好的资源。


由于并非所有浏览器都具有XMLHttpRequest类,因此这是一个无法实现的目标。而且,我指的是Internet Explorer浏览器。你需要做的是使用市场上那些“好用”的库,并使用它们的包装器来进行ajax调用。 - BiAiB
1
可能是一个重复问题:无法覆盖XMLHttpRequest上的getResponseHeader方法 - Marcel Korpel
我知道在IE中使用ActiveXObject,在其他浏览器中使用XMLHttpRequest。我想知道的是,有什么好方法可以扩展XMLHttpRequest,以便我可以拥有一个干净且安全的API供常规使用。 - Anil Namde
看看“市场上好的”库的代码 =) - kirilloid
你可以使用之前提到的框架,它们具有干净、安全、广泛使用和经过测试的API。所以,除非你有充分的理由,在这种情况下最好在这里说明一下,否则为什么不使用它们呢? - BiAiB
1个回答

8
不要这样做。 XMLHttpRequest 是一个主机对象,你不应该尝试扩展它。引用Kangax的话:
DOM 扩展的下一个问题是 DOM 对象是主机对象,并且主机对象是最糟糕的一群。按照规范(ECMA-262 3rd. ed),主机对象被允许做一些其他对象甚至无法想象的事情。引用相关部分[8.6.2]:
主机对象可以使用原型禁止扩展。

然而,正如Kangax也建议的那样,您可以创建一个包装器来包装XMLHttpRequest并对其进行任何所需的操作。


1
我完全同意,并且会写出类似的答案。此外,ActiveX XMLHttpRequest 对象(在IE中可用,并且优先于jQuery中的本机XMLHttpRequest对象)绝对不允许扩展。 - Tim Down
感谢您的热情和完整的回答。 - Anil Namde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接