2011-12-20 12 views
11

Diciamo che il nostro script è incluso in una pagina web, e uno scritto precedente (che già eseguito) ha fatto questo:Recupero metodi integrati che sono stati sovrascritti

String.prototype.split = function() { 
    return 'U MAD BRO?'; 
}; 

Così, il metodo split stringa è stato sovrascritto.

Vorremmo usare questo metodo, quindi abbiamo bisogno di recuperarlo in qualche modo. Certo, potremmo semplicemente definire la nostra implementazione di questo metodo e usarlo invece. Tuttavia, per il gusto di questa domanda, diciamo semplicemente che volevamo davvero recuperare l'implementazione del browser di quel metodo.

Quindi, il browser ha un'implementazione del metodo split (nel codice nativo, credo) e questa implementazione è assegnata a String.prototype.split ogni volta che viene caricata una nuova pagina Web.

Vogliamo questa implementazione! Lo rivogliamo nel String.prototype.split.

Ora, ho già trovato una soluzione: è un hack e sembra funzionare, ma potrebbe avere dei difetti, dovrei provare un po '... Quindi, nel frattempo, puoi venire con una soluzione a questo problema?

+0

Qual è il tuo trucco? –

+0

@ ЖΞЖ Utilizzo di un iframe, pubblicato da Raynos. L'ispirazione per questa domanda è stata [questa risposta] (http://stackoverflow.com/a/8453585/425275) a una delle mie domande precedenti ... –

risposta

16
var iframe = document.createElement("iframe"); 
document.documentElement.appendChild(iframe); 
var _window = iframe.contentWindow; 
String.prototype.split = _window.String.prototype.split; 
document.documentElement.removeChild(iframe); 

Utilizzare iframe per recuperare i metodi da oggetti host.

Nota ci sono trap con questo metodo.

"foo".split("") instanceof Array // false 
"foo".split("") instanceof _window.Array // true 

Il modo migliore per risolvere questo problema è di non utilizzare instanceof, mai.

Si noti inoltre che var _split = String.prototype.split come <script> tag prima che lo script cattivo o ad esclusione lo script cattivo è obvouisly una soluzione di gran lunga migliore.

+0

Riesci a pensare a qualche difetto con questo metodo? Potrebbero esserci problemi, come con l'operatore 'instanceof', dato che i metodi" appartengono "a costruttori stranieri ...? –

+0

I difetti di ŠimeVidas sono specifici dell'implementazione. '.split' restituisce una matrice che è un'istanza di' window.Array' o '_window.Array' – Raynos

+0

Secondo [questo test] (http://jsfiddle.net/gCCKf/), la matrice risultante è un'istanza di 'window.Array' in Firefox e Safari, ma un'istanza di' _window.Array' negli altri browser. –

Problemi correlati