恢复已被覆盖的内置方法

时间:2011-12-20 18:51:00

标签: javascript browser theory

假设我们的脚本包含在网页中,之前的脚本(已经执行过)执行此操作:

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

因此,split字符串方法已被覆盖。

我们想使用这种方法,所以我们需要以某种方式恢复它。当然,我们可以定义自己的方法实现并使用它。但是,为了这个问题,我们只是说我们真的想恢复浏览器对该方法的实现。

因此,浏览器具有split方法的实现(我相信在本机代码中),并且只要加载新的网页,就会将此实现分配给String.prototype.split

我们希望实施!我们希望它回到String.prototype.split

现在,我已经想出了一个解决方案 - 这是一个黑客攻击,它似乎有效,但它可能有缺陷,我需要测试一下......所以,在此期间,你能不能上来解决这个问题?

1 个答案:

答案 0 :(得分:19)

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

使用iframe从主机对象中恢复方法。

注意这种方法有陷阱。

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

解决此问题的最佳方法是永远不要使用instanceof

另请注意,var _split = String.prototype.split作为顽皮脚本之前的<script>标记或不包含顽皮脚本显然是一个更好的解决方案。