恢复覆盖的String原型

问题描述

我的JavaScript窗口中有一个覆盖的String.prototype。

window.String.prototype.toupperCase = ()=>{return "overridden"}

我有一个未触及的iframe窗口的引用,我想用它来创建一个没有覆盖函数的新字符串:

console.log(iframe.contentwindow.String("newstring").toupperCase());
// prints "overridden"

如何创建没有覆盖功能的新字符串?

对于使用全新iframe覆盖的Array.prototype而言有效,但对于String而言无效。

console.log(iframe.contentwindow.Array(1,2,3).filter(a=>a));
// that works - prints - [1,3]

注意

我知道不应该这样做。我想问的是在另一个第三方图书馆这样做的情况下如何解决它。

解决方法

问题是iframe.contentWindow.String("newstring") 只会返回一个字符串,该字符串与String("newstring")或只是"newstring"求和的原始字符串相同。当访问该字符串上的方法时,将使用当前域中的String.prototype,其中toUpperCase损坏。

您需要创建一个实例来获得一个继承自iframe String.prototype的{​​{3}}:

const stringObj = new iframe.contentWindow.String("newstring");
console.log(stringObj.toUpperCase());

但是,恢复该方法更容易:

String.prototype.toUpperCase = iframe.contentWindow.prototype.toUpperCase;
console.log("newstring".toUpperCase());