Как переопределить функцию JavaScript

109

Я пытаюсь переопределить встроенную parseFloatфункцию в JavaScript .

Как я могу это сделать?

Риз
источник
9
я бы не рекомендовал это делать. возможно создать другую функцию в прототипе?
KJYe.Name 葉家仁
Вы могли бы просто сделать это function parseFloat() {}, но, насколько я знаю, нет никакого способа вызвать тогда родную версию.
pimvdb
Функция переопределения - очень распространенная практика.
Джерри Лян,

Ответы:

231
var origParseFloat = parseFloat;
parseFloat = function(str) {
     alert("And I'm in your floats!");
     return origParseFloat(str);
}
Дэвид Уотерс
источник
А можно ли внутри кастома вызвать родную версию parseFloat? Я пробовал это, но возникает ошибка «Превышен максимальный размер стека вызовов»: jsfiddle.net/huZG2 . Спасибо.
pimvdb
1
Твоя веревка оборвана :)
Марсело
2
@ Дэвид Уотерс: Боюсь, ваш текущий код всегда будет предупреждать в Chrome.
pimvdb
11
@David Имейте в виду, что функция поднята, что означает, что она origParseFloatуказывает на функцию, которую вы объявляете сразу после. Это сработает.
HoLyVieR
1
@HoLyVieR спасибо Исправлено путем назначения функции имени ответ обновлен см. Jsfiddle.net/huZG2/6
Дэвид Уотерс
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
Анастасиос Селманис
источник
9

Сделать это можно так:

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

Посмотрите рабочий пример здесь: http://jsfiddle.net/LtjzW/1/

Кайл Уайлд
источник