Como substituir uma função JavaScript

109

Estou tentando substituir uma parseFloatfunção integrada em JavaScript .

Como eu faria isso?

Riz
fonte
9
eu não recomendaria fazer isso. talvez crie outra função dentro do protótipo?
KJYe.Name 葉家仁
Você poderia simplesmente fazer function parseFloat() {}, mas não há, até onde eu sei, nenhuma maneira de realmente chamar a versão nativa.
pimvdb
Substituir a função é uma prática muito comum.
Jerry Liang

Respostas:

231
var origParseFloat = parseFloat;
parseFloat = function(str) {
     alert("And I'm in your floats!");
     return origParseFloat(str);
}
David Waters
fonte
Também é possível chamar a versão nativa dentro de um custom parseFloat? Tentei fazer isso, mas ocorreu um erro 'Tamanho máximo da pilha de chamadas excedido': jsfiddle.net/huZG2 . Obrigado.
pimvdb
1
Sua corda está quebrada :)
Marcelo
2
@David Waters: Temo que seu código atual alerte para sempre no Chrome.
pimvdb
11
@David Lembre-se de que as funções são içadas, o que significa que origParseFloataponta para a função que você declara logo em seguida. Isso funcionaria.
HoLyVieR
1
@HoLyVieR thanks Corrigido atribuindo função ao nome da resposta atualizada, consulte jsfiddle.net/huZG2/6
David Waters
45

Você pode sobrescrever qualquer função embutida simplesmente declarando-a novamente.

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

Agora parseFloat(3)alertará 3.

Foguete Hazmat
fonte
Mas não há conceito de substituição de função nesta resposta, ou seja, funcionalidade de substituição, mas mantendo o mesmo nome da função.
Ahsan
18

Você pode substituí-lo ou, de preferência, estender sua implementação assim

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);

E chame-o como faria normalmente:

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

Você pode fazer assim:

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

Confira um exemplo prático aqui: http://jsfiddle.net/LtjzW/1/

Kyle Wild
fonte