Восстановление встроенных методов, которые были перезаписаны

Скажем, что наш 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, является явно лучшим решением.