javascript - 恢复已被覆盖的内置方法

标签 javascript browser theory

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

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

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

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

因此,浏览器有一个 split 方法的实现(我相信是在 native 代码中),并且这个实现被分配给 String.prototype.split 每当新网页已加载。

我们想要那个实现!我们希望它回到 String.prototype.split 中。

现在,我已经想出了一个解决方案 - 这是一个 hack,它似乎可以工作,但它可能有缺陷,我将不得不测试一下......那么,与此同时,你能想出有解决这个问题的办法吗?

最佳答案

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>在顽皮脚本之前标记或不包括顽皮脚本显然是一个更好的解决方案。

关于javascript - 恢复已被覆盖的内置方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8580431/

相关文章:

javascript - 让 WebDriver 使用 Protractor 和 cucumber 调整大小

windows - 如何在 Windows 7 中更改 Safari 中的默认用户代理?

java - 在 SWT 浏览器中访问 DOM 对象

algorithm - 空算法的时间复杂度是O(0)吗?

theory - 将 CFG 转换为 CNF

javascript - jQuery 的 mouseout() 和 mouseleave() 有什么区别?

javascript - jquery sweetalert 添加详细信息按钮

ios - 在不连接 APNS 的情况下向 Apple 设备发送推送通知

javascript - 渲染器中的 Electron 非上下文感知 native 模块

css - * { margin :0; padding:0; } in 2012