On Oct 1, 2012, at 15:53 , Brendan Eich wrote:

>> 2) BuiltIn.prototype has state that lets BuiltIn methods successfully 
>> operate on the object, at least as long as they don't modify the state.
>> 
>> True for ES5 objects, currently also true for ES Internationalization 
>> objects. This means Intl.Collator.prototype can be used as a Collator with 
>> default properties, which applications might find useful. Discussion so far 
>> inconclusive.
> 
> Mark has a conclusion: don't hide mutable state behind accessors in a 
> prototype. The reason is that Object.freeze can't freeze such state. Is 
> Intl.Collator.prototype's state hidden that way, or exposed to Object.freeze?

All state in Collator & Co. instances is hidden in internal properties, but we 
don't provide any means to modify the state after construction.

>> 3) The state mentioned in 2) is modifiable.
>> 
>> True for some ES5 objects (Array, Date, RegExp),
> 
> Don't forget Object :-P.

I'm thinking of state that goes beyond an empty object and makes a BuiltIn 
instance function as a BuiltIn instance. Object instances have no such state. 
Of course any prototype object is created extensible, so you can add properties 
that aren't relevant to its being a BuiltIn instance.

>>  not true for ES Internationalization objects. The discussion seems to 
>> conclude that modifiable prototype objects are a bad idea.
> 
> I'm not sure -- I would say the known problem is hidden (to Object.freeze) 
> mutable state, not data properties such as RegExp.lastIndex. Mark should 
> confirm.

Mutable state that can't be frozen is particularly dangerous, but there were 
also objections to having Map.prototype or Array.prototype as global storage 
bins.

>> 4) Object.getPrototypeOf(BuiltIn.prototype) returns BuiltIn.prototype.
>> 
>> False for ES5 objects and ES Internationalization objects. This would lead 
>> to infinite loops when looking up properties that don't exist, and we 
>> probably don't want that.
> 
> Yes, this makes no sense, not a goal in any scenario.
> 
>> 5) BuiltIn.prototype instanceof BuiltIn evaluates to true.
>> 
>> False for ES5 objects and ES Internationalization objects. The ES5 spec for 
>> instanceof relies on 4).
> 
> Indeed this cannot be true given that o instanceof C always gets o's 
> [[Prototype]] before matching against C.prototype -- always hops "one up the 
> chain".

If 4) were true, you'd have an infinite chain, so one hop wouldn't be an issue 
at all.

_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to