2012-07-09 20 views
6

Questa è una domanda ipotetica, in realtà non ha un uso pratico, ma ...JS ripristino predefinite funzioni/globali

Diciamo che si dovesse fare:

document.open = null; 

Come sarebbe uno ripristinare document.open alla sua funzionalità originale, è possibile (senza memoria temporanea creata dall'utente)? Document.open è archiviato in un'altra posizione con un nome meno noto? Grazie! :)

risposta

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

e poi si ripristina la funzione originale con

document.open = temp; 
+1

Interessante - Diciamo che non hai la temperatura! C'è un altro modo? –

+0

è necessario creare un riferimento in qualche modo ... ad es. eseguire una funzione anonima eseguibile auto eseguendo immediatamente documento.open come argomento – fcalderan

+1

Mi chiedevo soprattutto se il browser memorizza un secondo riferimento a sé stante –

9

sovrascrittura document.open crea una variabile/funzione denominata open direttamente sull'oggetto document. Tuttavia, la funzione originale non era sull'oggetto stesso ma sul suo prototipo, quindi è possibile ripristinarla.

La funzione open è da HTMLDocument.prototype quindi è possibile accedervi utilizzando HTMLDocument.prototype.open.

chiamarlo direttamente, utilizzare .call() per specificare l'oggetto da utilizzare su:

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

È possibile anche ripristinare document.open è semplicemente assegnandolo:

document.open = HTMLDocument.prototype.open; 

Tuttavia, ricorda che HTMLDocument e quindi document sono oggetti host e di solito è una buona idea non confonderlo - specialmente in IE è probabile che le cose vadano in tilt se si fa così.

+0

Ahah! Bello sapere, grazie! :) In risposta alle tue modifiche ... Affascinante! Non l'ho mai saputo, grazie ancora per l'informazione! :) Lo accetterò non appena sarò in grado di –

+0

bello sapere: +1 – fcalderan

+1

come si farebbe per farlo per qualcosa come 'alert'? cioè sovrascrivere 'window.alert' con una funzione personalizzata è abbastanza banale, ma il rollback è impegnativo senza mantenere un riferimento temporaneo: http://jsfiddle.net/ovfiddle/kcLBd/ –

4
delete document.open; 

non è intuitivo, ma usando la parola chiave delete su una funzione personalizzata ripristinerà la funzione originale, almeno fintanto che il prototipo non è stato sovrascritto.

Esempio:

> 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 

funziona allo stesso modo con document.open ed altre funzioni built-in.

+0

'delete alert' e' delete window.alert' falliscono entrambi, proprio come 'window.alert = window.prototype.alert' fallisce in http://jsfiddle.net/ovfiddle/kcLBd. A parte questo, ottima risposta. – 7vujy0f0hy