【发布时间】:2011-01-26 19:56:30
【问题描述】:
想到的这些方法,各有什么优缺点?
方法一:增强原生实例
var _XMLHttpRequest = XMLHttpRequest;
XMLHttpRequest = function() {
var xhr = new _XMLHttpRequest();
// augment/wrap/modify here
var _open = xhr.open;
xhr.open = function() {
// custom stuff
return _open.apply(this, arguments);
}
return xhr;
}
方法2:子“类”原生XMLHttpRequest
var _XMLHttpRequest = XMLHttpRequest;
XMLHttpRequest = function() {
// definePropertys here etc
}
XMLHttpRequest.prototype = new _XMLHttpRequest());
// OR
XMLHttpRequest.prototype = Object.create(_XMLHttpRequest);
// custom wrapped methods on prototype here
XMLHttpRequest.prototype.open = function() {
// custom stuff
return _XMLHttpRequest.prototype.open.apply(this, arguments);
}
方法 3:完全代理原生 XMLHttpRequest
var _XMLHttpRequest = XMLHttpRequest;
XMLHttpRequest = function() {
this.xhr = new _XMLHttpRequest();
}
// proxy ALL methods/properties
XMLHttpRequest.prototype.open = function() {
// custom stuff
return this.xhr.open.apply(this.xhr, arguments);
}
【问题讨论】:
-
最简单的方法就是使用 jQuery(或任何其他 JavaScript 框架)。
-
您的第一种方法对我来说似乎是错误的。我担心你会陷入递归循环,直到你得到一个堆栈溢出。 ;) 你为什么要这个呢?有很多更简洁的解决方案,不必提供对引用对象的函数调用。
-
Marcel:你说得对,它是一种类型,我已经修好了。
-
ThiefMaster:我的大部分问题都没有得到充分的回答......
-
使用方法3我得到一个错误
TypeError: Object [object Object] has no method 'setRequestHeader'