我很难理解这是如何保留一个功能而实质上扩展它的。
我看到(function(){})
会立即调用声明的函数。我不明白提供open
作为参数的原因。最后,我不明白(XMLHttpRequest.prototype.open)
发生了什么。这是调用原型函数吗?
(function(open) {
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
open.call(this, arguments);
};
})(XMLHttpRequest.prototype.open);
答案 0 :(得分:2)
function (open) { .. }
声明一个带有一个参数的函数
(..)(XMLHttpRequest.prototype.open)
正在调用此函数,并将open
XMLHttpRequest.prototype
函数作为参数传递。是的,它正在传递实际功能本身;函数可以像值一样传递。
因此,在IIFE(立即调用函数表达式)中,open
是XMLHttpRequest.prototype.open
的原始实现。
然后,在IIFE中,XMLHttpRequest.prototype.open
被新函数替换。在新函数内部,调用原始open
函数。这本身并不太令人兴奋,但它显示了如何在被调用的XMLHttpRequest.prototype.open
和正在执行的实际原始open
函数之间楔入您自己的代码。
IIFE的整个考验只是保留原始open
函数的句柄,在任何情况下都不能被其他代码覆盖,因为它是函数的本地函数。
答案 1 :(得分:1)
这是对此的精确复制。
//Create a XMLHttpRequest.realOpen function and store the original XMLHttpRequest.open function in it
XMLHttpRequest.prototype.realOpen = XMLHttpRequest.prototype.open;
//Change the XMLHttpRequest.open function
XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
//Do Your Code Here....
//Call original XMLHttpRequest.open function which is now saved in XMLHttpRequest.realOpen function
this.realOpen(method, url, async, user, password);
};