“删除” - 恢复本机功能不适用于更改原型,怎么样?

时间:2014-01-16 10:46:15

标签: javascript function google-chrome built-in

如果你改变这样的原生函数:

window.open= function (a,b,c)
{
    alert(2);
}

然后你可以

delete window.open

它将恢复原始功能,但是:

如果你改变它的原型:

window.__proto__.open= function (a,b,c)
{
    alert(3);
}

然后delete将不会做任何事情= \任何想法现在如何恢复它?

2 个答案:

答案 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(){[本地代码]}