On Oct 1, 2012, at 12:39 PM, Brendan Eich wrote:

> Allen Wirfs-Brock wrote:
>> Line 5.c.v is dealing with the ES5 requirement that "host objects" not reuse 
>> the listed [[Class]] values for anything other than the specified built-ins. 
>> This version of toStrimg extends the spirit to that restriction to all user 
>> or implementation defined tag values.  It does this by prepending a "~" in 
>> front of those values if they appear as a tag value.  Note that ES5.1 
>> includes "Object" in this list so I also included it. But, I actually think 
>> it probably should be in the censored list.
> 
> This is weird.
> 
> ES5 wanted to help SES and similar languages use some kind of
> 
>  original_Object_prototype_toString_call(anyObject).slice(8,-1)
> 
> and not be subject to spoofing.
> 
> Adding @@toStringTag to enable DOM self-hosting runs directly counter to this 
> goal.
> 
> Prefixing "~" to core-language built-in classes (save "Object"?) does not 
> resolve the conflict if there are spoofing hazards in other built-ins such as 
> DOM objects as typically implemented in browsers.
> 
> Mark, can you weigh in? I had not heard of this "~"-prefixing idea.

Let me try explaining this again, if we provide an extension point for 
parameterizing Object.prototype.toString and it allows arbitrary objects to 
produce, for example, "[Object Array]
" or "[Object Function]" then it invalidates all legacy uses of 
Object.prototype.toString as nominal type check for those specific built-ins.  
The "~" prefix is one way to avoid this problem.

DOM implementation usage is a separate issue, although arguably a motivating 
one making Object.prototype.toString extensible.  W3C specifications have 
consistently tried to use [[Class]] as an extension point for parameterizing 
Object.prototype.toString and implementations have supported them by providing 
implementation specific mechanisms that allow DOM implementations provide a 
[[Class]] value to Object.prototype.toString.

The proposed ES6 spec. for Object.prototype.toString recognizes the utility of 
such an extension point.  I would certainly be used by a ES-host DOM 
implementation but it would also be useful  for anyone else defining class-like 
abstractions where they want Object.prototype.toString.

The little quicks like the "~" prefix and the exception eating are simply what 
is necessary to formalize this extensibility model while still preserving the 
behavior of existing code that depends upon object.prototype.toString as a 
reliable mechanism to test for instances of the ES<=5.1 built-ins.

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

Reply via email to