Substituir a function (por exemplo, “alerta”) e chamar a function original?

Eu gostaria de replace uma function interna Javascript com uma nova versão que chama o original (da mesma forma para replace um método em uma class com uma versão que chama super em vários idiomas). Como posso fazer isso?

Por exemplo…

 window.alert = function(str) { //do something additional if(console) console.log(str); //super.alert(str) // How do I do this bit? } 

Armazene uma referência à function original em uma variável:

 (function() { var _alert = window.alert; // <-- Reference window.alert = function(str) { // do something additional if(console) console.log(str); //return _alert.apply(this, arguments); // <-- The universal method _alert(str); // Suits for this case }; })(); 

A maneira universal é .apply(this, arguments) - Para preservar o contexto e passar todos os argumentos. Normalmente, o valor de retorno do método original também deve ser retornado.

No entanto, sabe-se que o alert é uma function vazia, aceita apenas um argumento e não usa o object this . Portanto, _alert(str) é suficiente nesse caso.

Nota: IE <= 8 gera um erro se você tentar sobrescrever alert , então certifique-se de estar usando window.alert = ... vez de alert = ...

Não há “super”. De qualquer forma, crie um fechamento para “manter” em torno do object de function original.

Observe a “function de auto-chamada” que retorna um novo object de function (que é atribuído à propriedade window.alert ). O novo object de function retornado cria um fechamento em torno do original da variável que é avaliado para o valor original de window.alert que foi passado para a “function de auto-chamada”.

 window.alert = (function (original) { return function (str) { //do something additional if(console) { console.log(str) } original(str) } })(window.alert) 

No entanto, acredito que alguns navegadores podem impedir que o alert e outros resources internos sejam modificados …

Codificação feliz.

Estou assumindo que sua pergunta é como você sobrescreve um built-in e ainda será capaz de chamá-lo. Primeiramente, como um aviso, você nunca deve sobrescrever os built-ins, a menos que tenha uma boa razão para fazê-lo, pois isso tornará impossível depurá-lo / testá-lo.

É assim que você faria:

 window._alert = window.alert; window.alert = function(str) { if(console) console.log(str); window._alert(str); } 

Como fazer inheritance clássica simples em Javascript:

 SuperClass.call(this) // inherit from SuperClass (multiple inheritance yes) 

Como sobrescrever funções:

 this.myFunction = this.myFunction.override( function(){ this.superFunction(); // call the overridden function } ); 

A function de substituição é criada assim:

 Function.prototype.override = function(func) { var superFunction = this; return function() { this.superFunction = superFunction; return func.apply(this,arguments); }; }; 

Trabalha com vários argumentos.
Falha ao tentar replace indefinidos ou não funcionais.
Torna “superfunction” uma palavra “reservada” 🙂

JavaScript não usa um modelo de inheritance clássica. Há um belo artigo aqui que descreve uma maneira de escrever suas classs para que uma syntax semelhante possa ser usada, mas não é suportada nativamente.