2011-12-20 12 views
11

Powiedzmy, że nasz skrypt jest wliczone w strony internetowej, a także uprzednie skrypt (który już wykonane) to zrobił:Odzyskiwanie wbudowanych metod, które zostały nadpisane

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

Więc metoda split ciąg został nadpisany.

Chcielibyśmy skorzystać z tej metody, więc musimy ją jakoś odzyskać. Oczywiście moglibyśmy zdefiniować własną implementację tej metody i użyć jej zamiast tego. Jednak ze względu na to pytanie, powiedzmy, że naprawdę chcemy odzyskać implementację tej metody przeglądarki.

Tak więc przeglądarka ma implementację metody split (w natywnym kodzie, jak sądzę), a ta implementacja jest przypisana do String.prototype.split za każdym razem, gdy ładowana jest nowa strona internetowa.

Chcemy tej implementacji! Chcemy go z powrotem w String.prototype.split.

Teraz już wymyśliłem jedno rozwiązanie - to hack, i wygląda na to, że działa, ale może mieć wady, musiałbym przetestować trochę ... Więc, w międzyczasie, możesz przyjść z rozwiązaniem tego problemu?

+0

Jaki jest twój hack? –

+0

@ ЖΞЖ Korzystanie z elementu iframe, opublikowanego przez Raynos. Inspiracją dla tego pytania była [ta odpowiedź] (http://stackoverflow.com/a/8453585/425275) na jedno z moich poprzednich pytań ... –

Odpowiedz

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

Użyj elementów iframes, aby odzyskać metody z obiektów hosta.

Uwaga, istnieją pułapki z tą metodą.

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

Najlepszym sposobem, aby to naprawić, jest nieużywanie nigdy wcześniej żadnej wersji z instanceof.

Należy również pamiętać, że var _split = String.prototype.split jako <script> tag przed niegrzeczne skryptu lub nie w tym niegrzeczny skrypt jest obvouisly znacznie lepszym rozwiązaniem.

+0

Czy możesz wymyślić jakieś błędy tą metodą? Czy mogą wystąpić problemy, na przykład z operatorem 'instanceof', ponieważ metody" należą "do zagranicznych konstruktorów ...? –

+0

@ Wady ŠimeVidas są specyficzne dla implementacji. '.split' zwraca tablicę, która jest albo instancją' window.Array' lub '_window.Array' – Raynos

+0

Zgodnie z [tym testem] (http://jsfiddle.net/gCCKf/), wynikowa tablica jest instancją 'window.Array' w Firefoksie i Safari, ale instancja' _window.Array' w innych przeglądarkach. –

Powiązane problemy