Восстановление встроенных методов, которые были перезаписаны - PullRequest
13 голосов
/ 20 декабря 2011

Допустим, наш скрипт включен в веб-страницу, и предыдущий скрипт (уже выполненный) сделал это:

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

Итак, строковый метод split был перезаписан.

Мы хотели бы использовать этот метод, поэтому нам нужно как-то его восстановить.Конечно, мы могли бы просто определить нашу собственную реализацию этого метода и использовать его вместо этого.Однако, ради этого вопроса, давайте просто скажем, что мы действительно хотели восстановить реализацию этого метода в браузере.

Итак, браузер имеет реализацию метода split (в нативном коде яповерьте), и эта реализация присваивается String.prototype.split всякий раз, когда загружается новая веб-страница.

Мы хотим эту реализацию!Мы хотим, чтобы это вернулось в String.prototype.split.

Теперь я уже нашел одно решение - это хак, и оно, кажется, работает, но у него могут быть недостатки, мне придется немного протестировать... Итак, пока вы можете найти решение этой проблемы?

1 Ответ

19 голосов
/ 20 декабря 2011
var iframe = document.createElement("iframe");
document.documentElement.appendChild(iframe);
var _window = iframe.contentWindow;
String.prototype.split = _window.String.prototype.split;
document.documentElement.removeChild(iframe);

Использование iframes для восстановления методов из объектов хоста.

Обратите внимание, что в этом методе есть ловушки.

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

Лучший способ исправить это - никогда не использовать instanceof.

Также обратите внимание, что var _split = String.prototype.split как тег <script> перед непослушным сценарием или без учета непослушный сценарий, безусловно, является гораздо лучшим решением.

...