2012-04-25 2 views
15

Der Operator delete entfernt eine Eigenschaft von einem Objekt. Wenn ich eine Eigenschaft auf window gesetzt, ich es löschen:Warum können Sie eine überschriebene Eigenschaft des Fensters löschen?

window.myProp = 10; 
delete window.myProp; 

Wie the article ich so oft andere beziehen sich auf, wenn es um das Verhalten der delete Operator Staaten, ist dies, weil Eigenschaftszuweisung nicht die DontDelete nicht gesetzt Attribut (im Gegensatz zur Variablendeklaration, die dies tut).

Dieser Artikel gibt auch an den folgenden (Hervorhebung hinzugefügt):

beachten, dass es während der Erstellung Eigenschaft ist, die Attribute bestimmt werden (das heißt keine sind gesetzt). Spätere Zuordnungen ändern nicht Attribute der vorhandenen Eigenschaft. Es ist wichtig zu verstehen, dass diese Unterscheidung .

Unter Berücksichtigung dieser Tatsache, warum kann ich eine vorhandene Eigenschaft Fenster außer Kraft setzen, alert, und es dann auf den ursprünglichen Wert-Rückkehr löschen? Fehle ich etwas Offensichtliches? Ich benutze selten den delete Operator, so dass dies durchaus der Fall sein kann.

Zum Beispiel:

window.alert = function() {}; 
alert("Hi!"); //Nothing happens 

delete window.alert; 
alert("Hello?"); //Alerts 'Hello?' 

hier ein fiddle zu, dass zeigt (nur in Chome getestet, ziemlich sicher, dass IE wird auf diese Weise nicht so verhalten, aber den Zugang zu irgendetwas nicht sofort, aber Chrome).

+0

'delete' auf Host-Objekte ist nicht verlässlich und funktioniert nicht in IE. – Esailija

+0

möglich duplikate von [alert() funktioniert nicht in Chrome] (http://stackoverflow.com/questions/6184169/alert-not-working-in-chrome) –

+0

Ich weiß es nicht, aber ich mag Ihre Frage. Ich nehme an, es ist etwas wie ein CSS-Stil in einem Element, der den geerbten Stil außer Kraft setzt, und wenn dieser Elementstil über JS gelöscht wird, kehrt es zum geerbten Stil zurück ... Sie können es nur überschreiben, es wird nie gelöscht - nur Theorie. Was passiert auch, wenn Sie window.alert löschen möchten, ohne es zuvor als etwas anderes definiert zu haben? – squarephoenix

Antwort

9

In Chrome, die window.alert Funktion Teil des Prototyp der DOMWindow Klasse ist, es ist nicht eine Eigenschaft von window selbst.

also, wenn Sie window.alert überschreiben Sie das Hinzufügen einer neuen Eigenschaft window, aber die Version im Prototyp bestehen bleibt, ist aber versteckt.

Wenn Sie delete window.alert wird die Funktion in dem Prototyp erneut ausgesetzt.

Hier einige Konsolenausgabe zeigt, dass die Funktion in dem Prototyp ist:

> window.constructor.prototype 
DOMWindow 

> window.constructor.prototype.alert 
function alert() { [native code] } 

Firefox verhält sich ähnlich, wenn auch mit unterschiedlichen Klassennamen.

+0

Ahhh Ich wusste, dass es etwas Offensichtliches sein würde, das ich übersah! Vielen Dank. –

+0

@Alnitak Große Antwort .. @ James können wir auch die Alert-Eigenschaft auf Prototyp-Objekt löschen, aber ich würde strikt dagegen stehen .. Wir sollten nicht die Objekte ändern, die wir nicht besitzen .. So sollten wir idealerweise keine Alert-Eigenschaft aus löschen Fenster auch – sachinjain024

+0

Danke dafür. Wir haben einige Inkompetenz, mit der wir uns befassen müssen: Wir können unseren Code nur auf der Website des Kunden in einem bestimmten Element hinzufügen, können Skripte nicht früher auf der Seite anfassen oder Code vor deren Ausführung einfügen. Und früher auf der Seite wurde ein Skript ausgeführt, das Sprachzeichenfolgen im globalen Namespace ablegt, einschließlich 'open =" Open ";'. Plötzlich kann das Facebook SDK keine Dialoge mehr auf dem Handy öffnen. Ihre Antwort hat uns geholfen, window.open zu retten. – tremby

2

Dies ist das beabsichtigte Verhalten, es heißt Shadowing. Es ermöglicht Ihnen, benutzerdefinierte Funktionalität bereitzustellen, ohne die Funktionalität von Superklassen auszulöschen. Wenn Sie die Methode löschen, wird Ihre benutzerdefinierte Methode gelöscht und zeigt die ursprüngliche Methode vom Prototyp an.

Je tiefer Sie in die Vererbung gehen und die Art und Weise verstehen, wie der Prototyp funktioniert, desto mehr werden Sie feststellen, dass Instanzen von Menschen dies tun.

Ausgezeichnete Frage. Dies ist kein Bereich, der von den meisten JavaScript-Entwicklern meiner Erfahrung nach häufig genutzt wird. Wenn es diese Art von Sache nicht gäbe, wären viele Polyfills, die die Kernfunktionalität von JavaScript-Basisobjekten erweitern oder außer Kraft setzen, nicht möglich.

Verwandte Themen