2012-09-21 68 views
3

假设您有一个需要在页面上运行的脚本来覆盖JavaScript的JSON。 stringify,你会如何确保你的代码使用原始的字符串而不是被覆盖的字符串?如何在Javascript中恢复重写函数的原始状态

+0

运行你的代码的其他代码有机会修改过吗?我严重怀疑你可以找到变量(或函数,在这种情况下)之前有什么被覆盖... – tucuxi

+1

为什么你需要这样做? – Ryan

+1

http://stackoverflow.com/questions/8580431/recovering-built-in-methods-that-have-been-overwritten 似乎你可以创建一个iframe,并访问其(全新的,未修改的)内容。另外,你的问题是这个问题的一个重复,应该像这样关闭。 – tucuxi

回答

2

虽然我会选择在其他答案之一,这里的情况下的解决方案时:

  1. 无法改变,因此,
  2. 代码不能在代码覆盖JSON.stringify之前运行,因此;
  3. 代码不能保存原始函数对象(以恢复它或稍后显式使用它)。

这里有那么一个黑客:

  1. 创建一个IFRAME元素。
  2. 访问IFRAME元素的contentWindow属性;这应该包含原始的(或“新的未触及的”)JSON对象,并因此包含原始的JSON.stringify函数。

Here is the jsfiddle

3

如果您要创建库,请将其作为JSON.stringify应符合标准行为的要求。

对您的代码提出严格要求没有任何错误,并且它实际上是一个好主意。你只需要确定文件的要求。

显然,如果原件被永久覆盖,则无法使用它。将负担放在最终用户上是一个更好的解决方案。

如果这不是针对图书馆,而是针对个人项目,那么您应该简单地拒绝加载任何第三方代码,这些代码会做一些愚蠢的事情,而不会像使用不合格的方法替换符合方法一样愚蠢。

+0

+1撰写与发布时非常相似的内容。 –

+1

这是优雅的解决方案(“首先不要有这个问题”)。丑陋的解决方案在这里:http://stackoverflow.com/questions/8580431/recovering-built-in-methods-that-have-been-overwritten – tucuxi

+0

不幸的是,优雅的解决方案并不总是在Javascript中的一个选项。 – w43L

1

在覆盖之前对JSON.stringify进行备份。如果您无法对其进行备份,请使用a shiv

相关问题