2012-07-09 29 views
6

Ésta es una pregunta hipotética, lo que realmente no tiene un uso práctico, pero ...JS/restaurar las funciones globales por defecto

Digamos que se va a hacer:

document.open = null; 

¿cómo se restaurar document.open a su funcionalidad original, ¿es esto posible (sin almacenamiento temporal hecho por el usuario)? ¿Document.open está almacenado en otra ubicación con un nombre menos conocido? ¡Gracias! :)

Respuesta

1
var temp = document.open; 
document.open = null; 

a continuación, restaurar la función original con

document.open = temp; 
+1

Interesante - ¡Digamos que no tiene la temperatura! ¿Hay otra manera? –

+0

necesita crear una referencia de alguna manera ... p. ejecuta una función anónima autoejecutable que pasa document.open como argumento – fcalderan

+1

Me preguntaba sobre todo si el navegador almacena una segunda referencia por su cuenta –

9

Sobrescribiendo document.open crea una variable/función llamada open directamente en el objeto document. Sin embargo, la función original no estaba en el objeto sino en su prototipo, por lo que puedes restaurarlo.

La función open es de HTMLDocument.prototype para que pueda acceder a ella usando HTMLDocument.prototype.open.

llamarlo directamente, utilice .call() para especificar el objeto de utilizarlo en:

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

También puede restaurar document.open que simplemente asignándole:

document.open = HTMLDocument.prototype.open; 

Sin embargo, recuerde que HTMLDocument y por lo tanto, document son objetos host y, por lo general, es una buena idea no meterse con ellos, especialmente en IE, las cosas probablemente se vuelvan locas si lo haces.

+0

¡Ajá! Genial saberlo, gracias! :) En respuesta a sus cambios ... ¡Fascinante! ¡Nunca supe esto, gracias una vez más por la información! :) Lo aceptaré tan pronto como sea posible. –

+0

. Es bueno saber: +1 – fcalderan

+1

¿cómo se puede hacer para algo como 'alerta '? es decir, anular 'window.alert' con una función personalizada es bastante trivial, pero la reversión es un desafío sin mantener una referencia temporal: http://jsfiddle.net/ovfiddle/kcLBd/ –

4
delete document.open; 

No es intuitivo, pero el uso de la palabra clave de borrar en una función personalizada restaurará la función original, al menos tan largo como el prototipo no ha sido sobrescrito.

Ejemplo:

> 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 

funciona de la misma manera con document.open y otras funciones incorporadas.

+0

'delete alert' y' delete window.alert' fallan, al igual que 'window.alert = window.prototype.alert' falla en http://jsfiddle.net/ovfiddle/kcLBd. Aparte de eso, gran respuesta. – 7vujy0f0hy

Cuestiones relacionadas