2015-07-20 11 views
9

während Set ist ein Objekt, Object.freeze() Arbeiten auf die Eigenschaften des Objekts, die offenbar Karte und Set nicht verwenden: zBKann ein Set (oder Map) "eingefroren" werden?

 
let m = new Map(); 
Object.freeze(m); 
m.set('key', 55); 
m.get('key') ==> 55 

dies ist das Verhalten in Chrome, und ich erwarte, dass es Standard ist.

Ich verstehe, dass man (manchmal) das Set oder Map in ein normales Objekt transformieren und dann das Objekt einfrieren kann. aber dann ändert sich der Schlüsselzugriff zwischen der ungefroteten und der eingefrorenen Version.

+1

Welches Set und welche Karte verwenden Sie? Ich habe nicht in JavaScript gesehen – MaxZoom

+1

@MaxZoom: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map https://developer.mozilla.org/en-US/ docs/Web/JavaScript/Referenz/Global_Objects/Set –

+0

Sieht für mobile Browser nicht gut aus. – MaxZoom

Antwort

4

Interessante Frage, aber scheint derzeit nicht wie eine direkt unterstützte Funktion auf einem Set oder Map Objekt.

Hier sind einige Abhilfen I der Verwendung des Set Objekt als Leitfaden denken kann:

  1. Sie einen Proxy-Objekt erstellen können, die .add() entfernt, .clear() und .delete(), erlaubt aber den Zugriff auf alle anderen proxied Methoden, die nur Daten lesen. Dies würde den Zugriff auf das tatsächliche Set Objekt verbergen, so dass es keine Möglichkeit gäbe, direkt darauf zuzugreifen und proxied Zugriff auf alle anderen Methoden bereitzustellen.

  2. könnten Sie außer Kraft setzen .add(), .clear() und .delete() auf einem bestimmten Set Beispiel mit Methoden, die nichts tat oder eine Ausnahme ausgelöst hat, die Änderung verhindern würde. Wenn Sie diese Überschreibungsmethoden nicht konfigurierbar gemacht haben und dann eine .freeze() für das Objekt ausgeführt haben, konnten diese Methoden nicht zurückgesetzt werden. Man könnte Set.prototype.add direkt auf dem Objekt Set verwenden, um es dennoch zu umgehen.

+0

danke. zustimmen. das erste scheint sehr viel Arbeit zu sein und man verliert 'instanceof Set'. auf der zweiten Seite scheint das Überschreiben von '.add()' usw. einfacher zu sein, weil es im Hintergrund fehlschlägt oder einen Fehler auslöst. soweit "noch umgehen", ist für mich der Hauptvorteil des Einfrierens keine absolute Sicherheit, sondern eher der Schutz selbst, ähnlich wie das Tippen von Variablen. –

Verwandte Themen