如何解决恢复覆盖的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());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。