[[Class]] Property of Host Object
Allen Wirfs-Brock
Allen.Wirfs-Brock at microsoft.com
Sun Jul 18 07:31:16 PDT 2010
Table 8, section 8.6.2
Internal Property: [[Class]]
Value Type Domain: String
Description: A String value indicating a specification defined classification of objects
Allen
From: es-discuss-bounces at mozilla.org [mailto:es-discuss-bounces at mozilla.org] On Behalf Of Mark S. Miller
Sent: Saturday, July 17, 2010 12:54 PM
To: Garrett Smith
Cc: es5-discuss at mozilla.org; es-discuss
Subject: Re: [[Class]] Property of Host Object
In short, I largely agree with you about the language in the ES5 spec text. My interpretation of that text derives in large part from my memories of the conversations that led up to it, and my sense of the intent we were trying to capture. In the absence of that context, I would probably arrive at the same reading of ES5 that you have.
At this point, I will wait until others who participated in those conversations weigh in and state their sense of our agreed intent. Once we understand what agreed intent there actually was, we can proceed from there.
On Sat, Jul 17, 2010 at 12:17 PM, Garrett Smith <dhtmlkitchen at gmail.com<mailto:dhtmlkitchen at gmail.com>> wrote:
On 7/17/10, Mark S. Miller <erights at google.com<mailto:erights at google.com>> wrote:
> [+es5-discuss as a possible errata issue arises below]
>
>
> On Sat, Jul 17, 2010 at 12:37 AM, Garrett Smith
> <dhtmlkitchen at gmail.com<mailto:dhtmlkitchen at gmail.com>>wrote:
>
>> On 7/16/10, Mark S. Miller <erights at google.com<mailto:erights at google.com>> wrote:
>> > On Fri, Jul 16, 2010 at 9:54 PM, Garrett Smith
>> > <dhtmlkitchen at gmail.com<mailto:dhtmlkitchen at gmail.com>>wrote:
>> >
>> >> I have a question reqarding [[Class]] property as defined In ES5:
>> >>
>> >> | The value of the [[Class]] internal property of a host object
>> >> | may be any String value except one of "Arguments", "Array",
>> >> | "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number",
>> >> | "Object", "RegExp", and "String"
>> >>
>> >> May it be something other than a string value? Or must it be a string
>> >> value?
>> >>
>> >
>> > It must be a string value.
>> >
>>
>> The specification says "may".
>>
>
> Ah. I see the ambiguity. "may" there is modifying "any". It should probably
> have been stated:
>
> ...must be a String value and may be any String value except...
>
> In reviewing the document, the possibility that text would allow non-String
> [[Class]]es had not occurred to me. Now that you point it out, and can see
> some reasons why we might want to leave the current text alone and allow
> non-String [[Class]]es.
>
I don't.
[[Class]] must be a string value. If the [[Class]] property is absent,
what happens when the object is supplied to Object.prototype.toString?
TypeError. Why not avoid that possibility and require host object to
have [[Class]] be a string value?
>
>
>>
>> >
>> >>
>> >> Why must a host object's class be none of the built-in classes listed?
>> >>
>> >
>> > So that the [[Class]] property serve as a reliable nominal type check
>> > for
>> > the contract that the other internal properties and methods satisfy.
>> > This
>> is
>> > used primarily within the spec itself. Previously, it wasn't clear what
>> was
>> > meant when the spec said, for example, "if F is a function". Now we
>> clearly
>> > say "if the [[Class]] of F is 'Function' " if that's what we mean.
>> >
>>
>> I think I see the problem.
>>
>> What you really want to say there is:
>>
>> | The value of the [[Class]] internal property of any non-native host
>> | object must be any String value except one of...
>>
>
> Saying "non-native" and "host" together is redundant. Although the language
> of 4.3.6 and 4.3.8 is not as clear as it should be, I read these as stating
> that all EcmaScript objects are either host or native. No object can be both
> host and native. And no object can be neither host nor native.
>
It is not redundant. Repeating what was written in my last message:
| While the specification does not preclude the possibility that a host
| object may be implemented with native semantics, it nonetheless
| defines a host object:
I understand that the values for [[Class]] are used internally by the
specification. One example of that is Array.isArray(x), where the
[[Class]] property is used internally. Another example is behavior for
`JSON` reviver.
The specification allows for two types of host objects:
* host objects as native objects
* host objects as not native objects (does not use native semantics)
More information about the es-discuss
mailing list