Funzione di override (ad es. “Alert”) e chiama la funzione originale?

Vorrei sovrascrivere una funzione integrata di Javascript con una nuova versione che richiama l’originale (analogamente a sostituire un metodo su una class 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? } 

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

Il modo universale è .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 l' alert è una funzione di vuoto, accetta solo un argomento e non utilizza this object. Quindi, _alert(str) è sufficiente in questo caso.

Nota: IE < = 8 genera un errore se si tenta di sovrascrivere l' alert , quindi assicurarsi di utilizzare window.alert = ... anziché alert = ...

Non c’è “super”. In ogni caso, crea una chiusura per “mantenere” l’object-funzione originale.

Notare la “funzione di auto-richiamo” che restituisce un nuovo object-funzione (che è assegnato alla proprietà window.alert ). Il nuovo object funzione restituito crea una chiusura attorno original variabile che valuta il valore originale di window.alert passato alla “funzione di auto- window.alert “.

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

Tuttavia, ritengo che alcuni browser potrebbero impedire la modifica di alert e altri elementi incorporati …

Buona programmazione.

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à imansible il debug / test.

Questo è come lo faresti:

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

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” 🙂

JavaScript non usa un modello ereditario classico. C’è un buon articolo qui che descrive un modo per scrivere le tue classi in modo che possa essere usata una syntax simile, ma non è supportata nativamente.