Javascript 恢复已被覆盖的内置方法

Javascript 恢复已被覆盖的内置方法,javascript,browser,theory,Javascript,Browser,Theory,假设我们的脚本包含在一个网页中,之前的一个脚本(已经执行)执行了以下操作: String.prototype.split = function () { return 'U MAD BRO?'; }; 因此,splitstring方法已被覆盖 我们希望使用此方法,因此需要以某种方式恢复它。当然,我们可以定义这个方法的我们自己的实现并使用它。但是,出于这个问题的考虑,我们只想说,我们确实希望恢复浏览器对该方法的实现 因此,浏览器有一个split方法的实现(我相信是本地代码),每当加载新网

假设我们的脚本包含在一个网页中,之前的一个脚本(已经执行)执行了以下操作:

String.prototype.split = function () {
    return 'U MAD BRO?';
};
因此,
split
string方法已被覆盖

我们希望使用此方法,因此需要以某种方式恢复它。当然,我们可以定义这个方法的我们自己的实现并使用它。但是,出于这个问题的考虑,我们只想说,我们确实希望恢复浏览器对该方法的实现

因此,浏览器有一个
split
方法的实现(我相信是本地代码),每当加载新网页时,这个实现就被分配给
String.prototype.split

我们希望实现这一点!我们希望它回到
String.prototype.split

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

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\u split=String.prototype.split作为
标记放在顽皮脚本之前或不包含顽皮脚本显然是一个更好的解决方案。

你能想到这种方法有什么缺陷吗?是否会有问题,比如
instanceof
操作符,因为这些方法“属于”外国构造函数@ŠimeVidas缺陷是特定于实现的
.split
返回一个数组,该数组是
窗口的一个实例。Array
\u window.Array
根据,生成的数组是Firefox和Safari中
窗口.Array
的一个实例,但是其他浏览器中的
\u window.Array
的一个实例。我想在一个潜在的敌对环境中,任何可写的东西都可能被修补过,包括
document.createElement
,无法访问函数的原始版本,即
Object.defineProperty
和/或
Object.freeze
窗口。使用由Raynos发布的iframe打开
等。这个问题的灵感来源于我过去的一个问题。。。