恢复重写的window.JSON对象

pal*_*ogt 7 javascript json cross-browser

我无法控制的一些代码是覆盖全局JSON对象而不检查它是否已经实现:

var JSON = {
  org: "http://www.JSON.org",
  copyright: "(c)2005 JSON.org",
  license: "http://www.crockford.com/JSON/license.html",
  stringify: function(a, g) {
     ...
Run Code Online (Sandbox Code Playgroud)

问题是这个版本的JSON解析器非常老,并且有一个bug,这会影响我的序列化尝试.(其他人对此实现也有类似的问题.)

我可以使用浏览器的本机实现吗?我认为删除会起作用,但事实并非如此.我怀疑那是因为JSON是一个对象,而不是原型中方法.还有其他方法可以实现吗?

gsn*_*ers 10

您可以创建一个iframe元素(将加载about:blank并因此创建新的上下文)并从那里获取JSON对象.

function restoreJSON() {
  var f = document.createElement("iframe");
  f.style.display = "none";
  document.documentElement.appendChild(f);
  window.JSON = f.contentWindow.JSON;
  document.documentElement.removeChild(f);
}
Run Code Online (Sandbox Code Playgroud)

about:blank同步加载,因此无需等待load事件.虽然这不是恢复原始JSON对象,但它会得到一个与之相同的黑盒子.

  • 需要将`f`插入到DOM中以获得`contentWindow`,但是可以使用`display:none`. (2认同)