JavaScript:通过获取本机函数来防止函数覆盖

3

如何防止javascript函数被重新定义并获取标准函数?

让我解释一下:

我有一个模块,专门用于检测操纵DOM的浏览器扩展程序。

然而,该扩展程序可以重新定义任何原生函数。

因此,我尝试通过iframe元素获取原生函数。

在以下代码中,我这样做了,但是observe方法出现了非法调用错误。

( function() { 

//protection against overriding of MutationObserver and XMLHttpRequest method
var iframe_tag = document.createElement('iframe');
document.body.appendChild(iframe_tag);
window.MutationObserver = iframe_tag.contentWindow.MutationObserver;
window.XMLHttpRequest = iframe_tag.contentWindow.XMLHttpRequest;

// Callback function to execute when mutations are observed
var callback = function(mutationsList, observer) {
  //Here we detected a change....
};

// binding to window object --> does not work Illegal invocation
MutationObserver.prototype.observe = MutationObserver.prototype.observe.bind(this);

// Create an observer instance linked to the callback function
var bodyobserver = new MutationObserver(callback);

// Start observing the target node for configured mutations
bodyobserver .observe(document.body, config);


} ) ();

这样做对吗/我做错了什么?


你为什么要尝试将 MutationObserver 的方法绑定到 window 上? - Bergi
1个回答

1

你应该用整个原型覆盖它:

window.objectToOverride.prototype = Object.create(iframe.objectToOverride.prototype)

结果:

( function() { 

//protection against overriding of MutationObserver and XMLHttpRequest method
var iframe_tag = document.createElement('iframe');
document.body.appendChild(iframe_tag);
window.MutationObserver.prototype = Object.create(iframe_tag.contentWindow.MutationObserver.prototype);
window.XMLHttpRequest.prototype = Object.create(iframe_tag.contentWindow.XMLHttpRequest.prototype);

// Callback function to execute when mutations are observed
var callback = function(mutationsList, observer) {
  //Here we detected a change....
};

// binding to window object --> does not work Illegal invocation
// Not needed anymore
//MutationObserver.prototype.observe = MutationObserver.prototype.observe.bind(this);

// Create an observer instance linked to the callback function
var bodyobserver = new MutationObserver(callback);

// Start observing the target node for configured mutations
bodyobserver.observe(document.body, {});


} ) ();


不,你为什么要在这里使用Object.create?这样做没有意义。 - Bergi
将整个对象从iframe复制到window对象。 - klugjo
不是的?Object.create不会复制任何内容。它创建一个从参数继承的新对象。 - Bergi
这是我正在做的事情 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Classical_inheritance_with_Object.create() - klugjo
但是为什么呢?如果不是更好的话,window.objectToOverride.prototype = iframe.objectToOverride.prototype 将同样有效。调用 Object.create 不是必要的“复制整个对象”。 - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接