假设我们的脚本包含在网页中,并且之前的脚本(已经执行)执行了此操作:
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/