如果原始浏览器对象已更改,如何获取原始浏览器对象?

时间:2014-08-18 02:36:32

标签: javascript prototype monkeypatching

其实整个问题。一种反猴子补丁。如果原始对象(对象,数组,函数,字符串等)及其原型已更改\ expand \ deleted?

我现在看到的唯一选择 - 它是动态创建框架 - 拉出他的原生物体 - 动态移除框架。也许可以通过帮助Web Workers完成相同的工作。但他们即> 9,其中没有类DOM,并且其本身与动态帧相同。

框架示例

delete Object.prototype.constructor;
delete Object;

console.log(window.__proto__.__proto__.__proto__.constructor); // undefined
// console.log(Object); // undefined

var frame = document.createElement('frame');
document.all[0].appendChild(frame);

var Object = frames[0].Object;
document.all[0].removeChild(frame);
console.log(Object);

这个理论问题。 例如,我们正在开发一个嵌入式库,并且无法知道它何时被调用,因此在使用本机浏览器调用它时,可以更改它。我们需要获得原始对象,即初始环境。

也许有其他方法可以解决?

提前致谢。

1 个答案:

答案 0 :(得分:0)

在发布我的答案之前,我必须告诉你我不会说英语,所以请原谅我,我没有解决你的问题,但也许这对你有帮助。

我几周都在寻找如何获得toString内置函数,即使它被重新定义并且没有找到任何东西(除了创建一个新框架,但这个解决方案对我不起作用,因为我是使用节点js / node webkit)。

我开始搜索窗口对象,找不到可配置的对象,这样任何人都无法重新定义它们,我发现了这个:

Object.getOwnPropertyDescriptor(window, "top");
//Object {value: Window, writable: true, enumerable: true, configurable: false}
Object.getOwnPropertyDescriptor(top.__proto__, "toString");
//Object {value: function, writable: true, enumerable: false, configurable: false}

因此,如果我访问top.__proto__.toString总是获得真正的内置函数,因为它是不可配置的(到目前为止我找不到替换它的方法)。这对我在webkit客户端上工作,所以我必须继续搜索nodejs的解决方案。

顺便说一句,我删除了与你相同的对象构造函数,我在顶部找不到Object,但我认为它必须存储在某个地方。我会继续搜索,如果我找到解决方案,我会编辑这篇文章。

我希望我有所帮助。