我正在尝试在js中覆盖内置的parseFloat函数。我该怎么做呢?
答案 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();
};
哦,还有最后一点。 parseFloat
和核心 Javascript 库的其他组件,永远不应该被改变,这会破坏第三方包的依赖关系,并且通常会使开发人员感到困惑。
避免任何覆盖原始名称的代码:
const parseFloat = function () {} // bad practice
const Number.prototype.parseFloat = function () {} // bad practice