Ich lese es5 in diesen Tagen und stelle fest, dass das Attribut [[konfigurierbar]] in einigen integrierten Eigenschaften des globalen Objekts auf true festgelegt ist, was bedeutet, dass wir diese Eigenschaften löschen können.
Beispielsweise:
Die Join-Methode des Array.prototype-Objekts verfügt über Attribute
{[[Writable]]:true, [[Enumerable]]: false, [[Configurable]]: true}
So können wir die Join-Methode für Array einfach löschen:
delete Array.prototype.join;
alert([1,2,3].join);
Die Warnung wird undefined
in meinem Chrom 17, Firefox 9, dh 10, sogar ie6 angezeigt;
In Chrome 15 und Safari 5.1.1 ist das Attribut [[konfigurierbar]] auf true festgelegt und das Ergebnis zum Löschen ist ebenfalls true, das Endergebnis ist jedoch weiterhin gültig function(){[native code]}
. Scheint, als wäre dies ein Bug und Chrom behebt ihn.
Das habe ich vorher noch nicht bemerkt. Meiner Meinung nach ist das Löschen von integrierten Funktionen im Code des Benutzers gefährlich und führt zu so vielen Fehlern bei der Arbeit mit anderen. Warum trifft ECMAScript diese Entscheidung?
quelle
Antworten:
Ich stimme Ihnen eher zu, aber andererseits habe ich gerade eine Situation gefunden, die ich unter
delete JSON.stringify
bestimmten Umständen aufgrund eines Fehlers in Firefox 3.5 benötigte . Ich war auf jeden Fall froh, dass dort Affen-Patches eingebaut werden konnten.quelle
JSON.stringify
und bei Bedarf injiziert. Entschuldigung, das habe ich in meiner Antwort nicht erklärt.Konfigurierbar geht es nicht um Löschen.
Es geht um die Möglichkeit , einen schreibgeschützten Wert zu ersetzen.
Es ist ein sehr leistungsfähiges Tool, und nicht konfigurierbare Werte sind frustrierend, wenn Sie sie nicht löschen können.
Ich hatte einige Fälle, in denen ich einen obskuren Fehler beheben oder etwas andere Funktionen (Abfangen, Protokollieren) einschleusen musste. Das zu tun erfordert Ersetzen Sie den Wert.
Beispiel:
Die ganze Idee ist, dass, wenn Sie Eigenschaften löschen können, Sie mehr Metaprogrammiersteuerung haben. Wenn Sie sie nicht löschen könnten, würden Sie sich nur über die Sprache ärgern.
Es gibt keinen guten Grund, Objekte nicht löschbar zu machen, außer Menschen zu ärgern.
quelle
Ganz im Gegenteil. Das Zulassen von Anpassungen ist gut, da Autoren von Websites dadurch mehr Flexibilität erhalten.
Wenn der Autor der Website Code von Drittanbietern in dieselbe JS-VM laden muss und dazu den eingebauten JS-Parser verwenden möchte, kann er die Eigenschaften jederzeit sichern, indem er sie vor dem Laden des Codes von Drittanbietern auf nicht konfigurierbar setzt.
quelle