2014-01-16 8 views
5

wenn Sie ändern native Funktion wie folgt aus:"delete" - Wiederherstellung der nativen Funktion funktioniert nicht für den geänderten Prototyp, wie dann?

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

dann später können Sie nur

delete window.open 

und es wäre ursprüngliche Funktion wiederherzustellen, ABER:

, wenn Sie so sein Prototyp ändern:

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

dann delete w on't mach nichts = \ irgendwelche Ideen, wie man es jetzt wieder herstellt?

Antwort

9

Wenn Sie window.open zu etwas anderem ändern, z. mit window.open = 'something else';, dann bist du Shadowing die open Methode aus dem Prototyp;

// 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) 

Nach delete window.open Aufruf 'something else' zu löschen, wird die ursprüngliche Methode wieder sichtbar, weil sie nie von der Prototypkette verschwunden waren.

Aber wenn Sie die open Methode auf dem Prototyp, z. window.__proto__.open = bogus;, dann können Sie die alte Methode nicht einfach wiederherstellen. Also, um das „offenes Fenster“ Verhalten wieder, müssen Sie entweder einen Verweis auf die ursprüngliche Methode halten, bevor sie zu ersetzen,

var original_open = window.open; 
window.__proto__.open = 'bogus'; 
// .... whatever .... 
// Now restore it: 
window.__proto__.open = original_open; 

Oder leihen sie von einer anderen window, z.B. unter Verwendung eines temporären neuen Rahmen:

var frame = document.createElement('iframe'); 
document.body.appendChild(frame); 
window.__proto__.open = frame.contentWindow.open; 
frame.parentNode.removeChild(frame); 

Diese ganze Idee obwohl lächerlich ist: Sie sollte nicht brechen integrierten Methoden.

+0

also nach 'Dokument .__ Proto __. CreateElement =" Schein ";' gibt es keine Hoffnung mehr? :-) – Owyn

+2

@Owyn Es gibt viele Möglichkeiten, Frames zu erstellen: 'element.innerHTML = ..',' element.insertAdjacentHTML', 'document.createElementNS', um ein paar zu nennen –

+0

@Owyn Zumindest in Chrome, wenn Sie löschen document .__ proto __. createElement es stellt es zurück auf nativ oder abwesend, wie zutreffend. – kbenson