Восстановление встроенных методов, которые были перезаписаны
Скажем, что наш script включен в веб-страницу, а предыдущий script (уже выполненный) сделал это:
String.prototype.split = function () {
return 'U MAD BRO?';
};
Итак, строковый метод split
был перезаписан.
Мы хотели бы использовать этот метод, поэтому нам нужно как-то его восстановить. Конечно, мы могли бы просто определить нашу собственную реализацию этого метода и использовать его вместо этого. Однако, ради этого вопроса, позвольте сказать, что мы действительно хотели восстановить реализацию этого метода браузером.
Итак, браузер имеет реализацию метода split
(в собственном коде, я считаю), и эта реализация назначается String.prototype.split
всякий раз, когда загружается новая веб-страница.
Мы хотим эту реализацию! Мы хотим вернуть его в String.prototype.split
.
Теперь я уже придумал одно решение - это взломать, и, похоже, он работает, но у него могут быть недостатки, мне придется немного помериться... Итак, пока вы можете придумать с решением этой проблемы?
Ответы
Ответ 1
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>
перед тем, как озорной script или не содержит озорной script, является явно лучшим решением.