如何覆盖JavaScript函数


109

我试图覆盖JavaScript中的内置parseFloat函数。

我将如何去做?


9
我不建议这样做。也许在原型中创建另一个功能?
KJYe.Name叶家仁2011年

您可以这样做function parseFloat() {},但是据我所知,当时还没有办法真正调用本机版本。
pimvdb 2011年

覆盖功能是很常见的做法。
杰里·梁

Answers:


231
var origParseFloat = parseFloat;
parseFloat = function(str) {
     alert("And I'm in your floats!");
     return origParseFloat(str);
}

也可以在自定义内调用本机版本parseFloat吗?我尝试了这个,但是它出错了“超出最大调用堆栈大小”:jsfiddle.net/huZG2。谢谢。
pimvdb 2011年

1
您的字符串已损坏:)
Marcelo

2
@David Waters:恐怕您当前的代码会永远在Chrome中发出警报。
pimvdb 2011年

11
@David请记住,函数已被吊起,这意味着origParseFloat指向您随后声明的函数。会起作用。
霍利维尔

1
@HoLyVieR,谢谢。已通过将函数分配给名称答案来解决此问题,请参见jsfiddle.net/huZG2/6
David Waters

45

您可以通过重新声明任何内置函数来覆盖它。

parseFloat = function(a){
  alert(a)
};

现在parseFloat(3)将发出警报3。


但是在此答案中没有功能覆盖的概念,即,覆盖功能但保持功能名称相同。
Ahsan

18

您可以覆盖它,或者最好像这样扩展它的实现

parseFloat = (function(_super) {
    return function() {
        // Extend it to log the value for example that is passed
        console.log(arguments[0]);
        // Or override it by always subtracting 1 for example
        arguments[0] = arguments[0] - 1;
        return _super.apply(this, arguments);
    };         

})(parseFloat);

然后像平常一样调用它:

var result = parseFloat(1.345); // It should log the value 1.345 but get the value 0.345

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.