如何覆盖javascript函数

时间:2011-03-23 17:45:22

标签: javascript

我正在尝试在js中覆盖内置的parseFloat函数。我该怎么做呢?

5 个答案:

答案 0 :(得分:196)

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

答案 1 :(得分:39)

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

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

现在parseFloat(3)会提醒3。

答案 2 :(得分:8)

你可以这样做:

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

在此处查看一个有效的示例:http://jsfiddle.net/LtjzW/1/

答案 3 :(得分:5)

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

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

答案 4 :(得分:0)

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

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