Domanda Funzione di override (ad esempio "avviso") e chiama la funzione originale?


Vorrei eseguire l'override di una funzione integrata di Javascript con una nuova versione che richiama l'originale (analogamente a sostituire un metodo su una classe con una versione che chiama super in molte lingue). Come posso fare questo?

Per esempio...

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

    //super.alert(str) // How do I do this bit?
}

18
2018-05-03 08:28


origine


risposte:


Memorizza un riferimento alla funzione originale in una variabile:

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

La via universale è <original_func_reference>.apply(this, arguments) - Per mantenere il contesto e passare tutti gli argomenti. Di solito, deve essere restituito anche il valore di ritorno del metodo originale.

Tuttavia, è noto che alert è una funzione di vuoto, accetta solo un argomento e non usa il this oggetto. Così, _alert(str) è sufficiente in questo caso.

Nota: IE <= 8 genera un errore se si tenta di sovrascrivere alert, quindi assicurati di utilizzarlo window.alert = ... invece di alert = ....


37
2018-05-03 08:30



Non c'è "super". In ogni caso, crea una chiusura per "mantenere" l'oggetto-funzione originale.

Notare la "funzione di auto-richiamo" che restituisce un nuovo oggetto-funzione (che è assegnato al window.alert proprietà). Il nuovo oggetto funzione restituito crea una chiusura attorno al variabile  original che valuta l'originale valore di window.alert è stato passato alla "funzione auto-invocante".

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

tuttavia, io credere alcuni browser potrebbero impedire alert e altri built-in da essere modificati ...

Buona programmazione.


16
2018-05-03 08:31



Suppongo che la tua domanda sia come sovrascrivi un built-in e puoi ancora chiamarlo. Prima di tutto come disclaimer, non dovresti mai sovrascrivere i built-in se non hai una buona ragione per farlo poiché renderà impossibile il debug / test.

Questo è come lo faresti:

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

2
2018-05-03 08:31



Come fare l'ereditarietà classica semplice in Javascript:

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

Come sovrascrivere le funzioni:

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

La funzione di override è creata in questo modo:

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

Funziona con più argomenti.
  Non riesce quando si tenta di sovrascrivere indefiniti o non funzionanti.
Rende "superFunction" una parola "riservata" :-)


2
2017-10-01 11:04



JavaScript non usa un modello ereditario classico. C'è un bello articolo qui che descrive un modo per scrivere le tue classi in modo che possa essere usata una sintassi simile, ma non è supportata in modo nativo.


1
2018-05-03 08:32