2011-01-10 13 views
3

Ich bin neugierig: weiß jemand, warum die ECMAScript5-Spezifikation die Eigenschaften des vordefinierten Objektprototyps im strikten Modus nicht verschärft hat? Zum Beispiel scheint es so, als gäbe es keine Informationen darüber, wie hasOwnProperty definiert ist. Ich habe versucht, es neu zu definieren (und den Code in FF4 beta getestet) und ich konnte damit durchkommen. Wenn ich nichts zu tun haben falsch, dann bedeutet dies, dass jeder kann noch die Eigenschaft Object.prototype.hasOwnProperty neu definieren und wirklich schrauben gesamten Code, der für die Arbeit Eigentum auf sie verlässt sich ...hasOwnProperty und ECMAScript 5 strict mode

Gedanken dazu?

EDIT: ein wenig mehr Informationen, als ich durch die Spezifikation graben ...

Wie ich unten in einem Kommentar gesetzt haben, können Sie nicht wirklich Object.prototype im strikten Modus ändern aufgrund der Metadaten, wurde darauf angewendet (Writable, Enumerable und Configurable sind alle auf false gesetzt) ​​und FF 4 Beta (die ich verwende, um meine Tests auszuführen) erzeugt die Ausnahme.

danke.

+0

Die Frage ist: Sind integrierte Objekte standardmäßig versiegelt? Ich habe noch nicht in ES5 gegraben, daher kenne ich die Antwort auf diese Frage nicht. –

+0

@ Šime Vidas Nein, integrierte Objekte sind standardmäßig nicht versiegelt. Ihre [[Extensible]] wird auf 'true' gesetzt, so dass Sie ihnen einfach Eigenschaften hinzufügen können (siehe Abschnitt 15). AIUI, das Ziel war es, das ES-Objektmodell flexibel zu halten und nur absolut wichtige Teile zu sperren (zB globale, nicht definierte, NaN- und Infinity-Eigenschaften nicht beschreibbar und nicht konfigurierbar zu machen) – kangax

Antwort

3

Und? Ich kann alles töten auf Object.prototype, wenn ich wollte, nicht solche Code in Ihrem Projekt/Website, nicht tun, etwas besser, finden Sie diese Idioten, die solche Dinge tun und stellen Sie sicher, dass sie Kick in die Bälle.

Ich meine, ich kann sogar jede gegebene Python (2.x) Programm, indem Sie True = False tun vermasseln.

Sie können nie vor Idioten schützen. Noch nie. Versuche sie zu erziehen oder zu vermeiden.

EDIT

die Unmöglichkeit, dies zu klären, wenn Sie Ihr Skript in eine anonyme Wrapper kapseln (wie Sie tun sollen, wenn Sie es mit anderem Code verwenden) die "use strict" wird Ihren Code lokal sein.

Das bedeutet, wenn der böse Idiot Code nicht strikt Modus für sich allein verwendet - und sie werden nicht ... es sei denn, sie sind totale Idioten, die ich hier nicht spreche - sie laufen in ES3 und deine schöne Strenge existiert nicht einmal.

+1

"Streite nie mit einem Idiot, ziehen sie Sie auf ihr Niveau und schlagen Sie mit Erfahrung " – qwertymk

+0

Nun, nicht wirklich. Betrachtet man die Spezifikation, sehe ich, dass Object.prototype die folgenden Attribute hat: Writable: false, enumerable: false und konfigurierbar: false. Ich habe auch versucht, es zu ändern, und ich habe bemerkt, dass FF eine Ausnahme erzeugt, wenn Sie versuchen, das zu tun. –

+0

@Luis Guess Ich habe die falsche Formulierung verwendet, ich kann einfach alle Eigenschaften daraus löschen, nur die Eigenschaft 'Prototyp' von' Object' kann nicht überschrieben werden. –