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

Owy*_*wyn 5 javascript google-chrome function built-in

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

window.open= function (a,b,c)
{
    alert(2);
}
Run Code Online (Sandbox Code Playgroud)

那么以后你可以

delete window.open
Run Code Online (Sandbox Code Playgroud)

它会恢复原来的功能,但是:

如果你改变这样的原型:

window.__proto__.open= function (a,b,c)
{
    alert(3);
}
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*b W 10

当您更改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)
Run Code Online (Sandbox Code Playgroud)

在调用delete window.opendelete之后'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;
Run Code Online (Sandbox Code Playgroud)

或者从另一个借用它window,例如使用临时新框架:

var frame = document.createElement('iframe');
document.body.appendChild(frame);
window.__proto__.open = frame.contentWindow.open;
frame.parentNode.removeChild(frame);
Run Code Online (Sandbox Code Playgroud)

这整个想法很荒谬:你不应该打破内置方法.

  • @Owyn有很多方法可以创建框架:`element.innerHTML = ..`,`element.insertAdjacentHTML`,`document.createElementNS`,仅举几例 (2认同)