It's fine to propose something to make maps immutable. Just don't call it 
Object.freeze.






On Thu, Apr 30, 2015 at 11:56 AM -0700, "C. Scott Ananian" 
<[email protected]<mailto:[email protected]>> wrote:

Can you make an alternative proposal that still preserves the essential 
property of Object.freeze on collections -- that is to say, preserves object 
identity while preventing future writes?

Here's another strawman:
> Add "[[Immutable]]" to the arguments of OrdinaryCreateFromConstructor in step 
> 2 of 23.1.1.1 (Map) and 23.2.1.1 (Set)
> Add "If the [[Immutable]] internal slot of M is true, throw a TypeError 
> exception" between steps 3 and 4 of 23.1.3.1 (Map.prototype.clear), 23.1.3.3 
> (Map.prototype.delete), 23.1.3.9 (Map.prototype.set), 23.2.3.1 
> (Set.prototype.add), 23.2.3.2 (Set.prototype.clear), and 23.2.3.4 
> (Set.prototype.delete).
> Add `Map.prototype.makeReadOnly()` and `Set.prototype.makeReadOnly()` methods 
> with the definition:
>  1. Let M be the this value.
>  2. If Type(M) is not Object, throw a TypeError exception
>  3. If M does not have a [[Immutable]] internal slot, throw a TypeError 
> exception
>  4. Set the [[Immutable]] internal slot of M to true.

This is somewhat awkward and ad-hoc, but it won't break ES6 code.

I am concerned about this issue in part because as written is seems to be 
impossible to prevent writes to Map.  If you subclass it, freeze it, override 
set/delete/etc it is still possible to mutate the map using `Map.set.call(m, 
'a', 'b');`.  And there is no way for use code to get at the [[MapData]] slot 
to protect it.
  --scott


On Thu, Apr 30, 2015 at 2:42 PM, C. Scott Ananian 
<[email protected]<mailto:[email protected]>> wrote:
On Thu, Apr 30, 2015 at 2:22 PM, Mark S. Miller 
<[email protected]<mailto:[email protected]>> wrote:
It would also not be compatible with ES6 code. SES will be freezing Map, Set, 
WeakMap, and WeakSet instances in order to tamper proof their API. I expect 
many others will as well. Having this freeze then cause a non-mutability in ES7 
will break all such ES6 code. This is a non-starter all around.

Couldn't SES use Object.seal/Object.preventExtensions/Object.defineProperty to 
perform tamper-proofing without flipping the "frozen" bit?
 --scott

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to