如果你改变这样的原生函数:
window.open= function (a,b,c)
{
alert(2);
}
然后你可以
delete window.open
它将恢复原始功能,但是:
如果你改变它的原型:
window.__proto__.open= function (a,b,c)
{
alert(3);
}
然后delete
将不会做任何事情= \任何想法现在如何恢复它?
答案 0 :(得分:9)
当您将window.open
更改为其他内容时,例如使用window.open = 'something else';
,然后您从原型中阴影 open
方法;
// Looking up window.open (in the prototype chain)....
window.open; // Found, result == 'something else'
window.__proto__.open; // Not accessible any more (shadowed by previous line)
在调用delete window.open
删除'something else'
后,原始方法再次可见,因为它从未从原型链中消失。
但是如果你在原型上修改了open
方法,例如window.__proto__.open = bogus;
,那么你就无法轻易恢复旧方法。因此,要再次获得“打开窗口”行为,您需要在替换之前保留对原始方法的引用,
var original_open = window.open;
window.__proto__.open = 'bogus';
// .... whatever ....
// Now restore it:
window.__proto__.open = original_open;
或从其他window
借用,例如使用临时新框架:
var frame = document.createElement('iframe');
document.body.appendChild(frame);
window.__proto__.open = frame.contentWindow.open;
frame.parentNode.removeChild(frame);
这整个想法很荒谬:你不应该破坏内置方法。
答案 1 :(得分:0)
删除window.open;
(function(func) {
var frame = document.createElement('iframe');
document.body.appendChild(frame);
// Intentionally set in global scope
window[func] = frame.contentWindow[func];
frame.parentNode.removeChild(frame);
})("open");
打开
ƒopen(){[本地代码]}