如何覆盖 JavaScript 函数

IT技术 javascript
2021-01-19 07:33:08

我正在尝试覆盖JavaScript 中的内置parseFloat函数

我该怎么做呢?

5个回答
var origParseFloat = parseFloat;
parseFloat = function(str) {
     alert("And I'm in your floats!");
     return origParseFloat(str);
}
是否也可以在自定义中调用本机版本parseFloat我试过这个,但它错误 'Maximum call stack size exceeded': jsfiddle.net/huZG2谢谢。
2021-03-20 07:33:08
@David Waters:恐怕您当前的代码会在 Chrome 中永远发出警报。
2021-03-25 07:33:08
@HoLyVieR:谢谢,我认为可以覆盖和使用本机parseFloatjsfiddle.net/huZG2/3
2021-03-27 07:33:08
@David 请记住,函数已被提升,这意味着它origParseFloat指向您之后声明的函数。会奏效。
2021-04-04 07:33:08
@HoLyVieR 感谢通过将函数分配给名称答案来修复更新,请参阅jsfiddle.net/huZG2/6
2021-04-11 07:33:08

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

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

现在parseFloat(3)将警报 3。

这不是函数覆盖,这是完全覆盖。
2021-03-18 07:33:08
但是在这个答案中没有函数覆盖的概念,即覆盖功能但保持函数名称相同。
2021-03-30 07:33:08

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

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

你可以这样做:

alert(parseFloat("1.1531531414")); // alerts the float
parseFloat = function(input) { return 1; };
alert(parseFloat("1.1531531414")); // alerts '1'

在此处查看一个工作示例:http : //jsfiddle.net/LtjzW/1/

覆盖是面向对象编程的一个概念,它是在类方法上完成的。

Javascript 有类(和原型继承),但parseFloat它只是一个函数,而不是一个类(或原型)。所以你要么需要创建parseFloat一个类方法,要么覆盖相关的Number.parseFloat方法。

让我们进一步探讨这一点。覆盖方法不会改变(扩展或覆盖)原始父方法。如以下示例所示:

class A {
  // parent method
  print() {
    console.log("class A");
  }
}

class B extends A {
  // override method
  print() {
    console.log("class B");
  }
  parentPrint() {
    super.print();
  }
}

const b = new B();
b.print(); // prints "class B" from override method
b.parentPrint(); // prints "class A" from parent method

要将其应用于Number.parseFloat,我们可以这样做:

class A extends Number {
  // overrides `parseFloat` from Number class
  parseFloat() {
    super.parseFloat();
  }
}

const a = new A();
a.parseFloat();

但是,我的建议是在这种情况下使用组合,而不是继承。

const parseFloatOverride = function () {
  return parseFloat();
};

警告:不要覆盖 Javascript 核心库

哦,还有最后一点。parseFloat和核心 Javascript 库的其他组件,永远不应该被改变,这会破坏第三方包的依赖关系,并且通常会使开发人员感到困惑。

避免任何覆盖原始名称的代码:

const parseFloat = function () {}; // bad practice
const Number.prototype.parseFloat = function () {}; // bad practice