扩展Javascript原型方法

时间:2015-10-02 15:01:54

标签: javascript

我很难理解这是如何保留一个功能而实质上扩展它的。

我看到(function(){})会立即调用声明的函数。我不明白提供open作为参数的原因。最后,我不明白(XMLHttpRequest.prototype.open)发生了什么。这是调用原型函数吗?

(function(open) {
  XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
    open.call(this, arguments);
  };
})(XMLHttpRequest.prototype.open);

2 个答案:

答案 0 :(得分:2)

function (open) { .. }声明一个带有一个参数的函数 (..)(XMLHttpRequest.prototype.open)正在调用此函数,并将open XMLHttpRequest.prototype函数作为参数传递。是的,它正在传递实际功能本身;函数可以像值一样传递。

因此,在IIFE(立即调用函数表达式)中,openXMLHttpRequest.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);
};