[[Class]] Property of Host Object

David Flanagan david at davidflanagan.com
Thu Jul 22 23:16:06 PDT 2010


The host vs. native distinction has long bothered me as well.  Thanks 
for a particularly lucid explanation.  In the next edition of the spec, 
perhaps you could go further and eliminate the use of the word "host" 
altogether, leaving you with only native objects and non-native objects. 
  Then you don't have to say that host objects can be native, or non-native.


You could drop the confusing word "host", too.  If you invert the 
boolean sense of your function then you can call it isNativeObject() or 
isNativeValue() or just isNative().

I submitted similar comments to Allen while the spec was in its public 
review phase.  I didn't feel strongly about getting it fixed, however, 
because the ambiguous definitions in question are in a non-normative 
portion of the spec.  (All of section 4, including the definitions are 

And tangentially related to the original question about the nature of 
alert, and tangentally related to the notion of accidentally provided 
discrimination mechanisms, here is how to determine whether an ES5 
object (native or non-native) is callable.  It relies on the fact that 
forEach() tests for callability before checking for an empty array.

Object.isCallable = function(o) {
     // Array.prototype.forEach throws TypeError for non-callable args
     try {
         [].forEach(o);  // o will never be invoked since array is empty
         return true;
     } catch (x) {
         if (x instanceof TypeError) return false;
         else throw x;

Of course I don't have an ES5 implementation with callable objects that 
are not functions to test it out on.


Mark S. Miller wrote:
> On Mon, Jul 19, 2010 at 2:35 PM, Allen Wirfs-Brock 
> <Allen.Wirfs-Brock at microsoft.com 
> <mailto:Allen.Wirfs-Brock at microsoft.com>> wrote:
>      > -----Original Message-----
>      > From: Mark S. Miller [mailto:erights at google.com
>     <mailto:erights at google.com>]
>      > Sent: Monday, July 19, 2010 2:02 PM
>      > >
>      >> Do we??  What do you think "host object" means?
>      >
>      > Objects that are not native objects. I.e., the categories are
>     disjoint and Garrett's
>      > isHostObject method is correct.
>      >
>     Ok, I think we generally agree.  "host object" as used in the ES5
>     spec. in essentially all cases means  "not native object".
>      Garrett's isHostObject test would arguably almost be valid if used
>     within a perfectly conforming and unextended ES5 implementation.
>      However, a conforming implementation is allowed to "provide
>     additional types, values, objects,..." and such extensions might
>     include the use of new [[Class]] values.  For example, the JSON
>     object is semantically a perfectly normal native object but has a
>     distinct [[Class]] value.  If an implementation included a different
>     but similar extension isHostObject would classify it as a "host
>     object".  Whether or not you are happy with that result probably
>     depends upon your isHostObject use case.
> I agree. FWIW, I am happy with that result. By the definition of ES5 
> "native object", such an object is not an *ES5* native object, since it 
> has a [[Class]] value not defined by the ES5 spec. By the note on the 
> host object definition, it is therefore (to ES5) a host object.
> Perhaps Garrett's function should be renamed isES5HostObject for 
> clarity. With that new name, I would feel comfortable using and 
> recommending use of that function.
>     The starting point of this discussion seems to be the desire to find
>     a reliable way to discriminate  "host objects".  ES5 wasn't
>     intentionally trying to provide such a mechanism and I don't believe
>     that it accidently did so.
> I agree that we did not intend to provide such a discrimination 
> mechanism. But I do think we accidentally did so.
>     Allen
> -- 
>     Cheers,
>     --MarkM
> ------------------------------------------------------------------------
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss

More information about the es-discuss mailing list