9

这是一个假设性的问题,它确实没有实际用途,但是......

假设你要做:

document.open = null;

如何将 document.open 恢复为其原始功能,这可能吗(没有用户制作的临时存储)?document.open 是否以鲜为人知的名称存储在另一个位置?谢谢!:)

4

3 回答 3

10

覆盖document.open创建open直接在document对象上命名的变量/函数。但是,原始函数不是在对象本身上,而是在它的原型上——所以你确实可以恢复它。

open函数来自,HTMLDocument.prototype因此您可以使用HTMLDocument.prototype.open.

要直接调用它,请使用.call()指定要在其上使用它的对象:

HTMLDocument.prototype.open.call(document, ...);

您也可以document.open通过简单地分配它来恢复它:

document.open = HTMLDocument.prototype.open;

但是,请记住,HTMLDocumentanddocument是宿主对象,通常最好不要弄乱它们——尤其是在 IE 中,如果你这样做,事情可能会变得混乱。

于 2012-07-09T22:38:54.947 回答
5
delete document.open;

这不直观,但是在自定义函数上使用 delete 关键字将恢复原始函数,至少只要原型没有被覆盖。

例子:

> console.log
function log() { [native code] }

> console.log = function() { }
function () { }

> console.log("Hello world");
undefined

> delete console.log;
true

> console.log("Hello world");
Hello world

与 document.open 和其他内置函数的工作方式相同。

于 2013-06-21T02:09:29.420 回答
1
var temp = document.open;
document.open = null;

然后你恢复原来的功能

document.open = temp;
于 2012-07-09T22:36:21.520 回答