W3C home > Mailing lists > Public > public-webapi@w3.org > June 2007

Re: Prototype chain for objects that implement multiple interfaces

From: Cameron McCormack <cam@mcc.id.au>
Date: Wed, 6 Jun 2007 22:12:36 +1000
To: public-webapi@w3.org
Message-ID: <20070606121236.GD6026@arc.mcc.id.au>

Cameron McCormack:
> >  NodeList = { an object }
> >  NodeList.[[Prototype]] = Object prototype object
> >  NodeList.prototype = { an object }
> >  NodeList.prototype.[[Prototype]] = Object prototype object
> >  NodeList.prototype.constructor = NodeList
> >  NodeList.prototype.someFunction = { some function }

liorean:
> Well, if there is no [[Construct]] property on the NodeList that is
> callable using
>    new NodeList
> I don't think the NodeList.prototype.constructor property should point
> to the NodeList object. If there is a constructor that is callable in
> that way then let it point there. If there is no such constructor then
> there should not be a NodeList.prototype.constructor property.

That’s probably fair.  Mozilla does have a constructor property, but the
other browsers I tested don’t.

> Also I think you forgot two things:
>    NodeList.[[Class]] = "Object"
>    NodeList.prototype.[[Class]] = "NodeList"
> 
> (The ECMAScript built-in constructors all follow the pattern of having
> [[Call]], so their [[Class]] is "Function" instead and their
> [[Prototype]] is the initial Function.prototype. The DOM constructors
> don't have [[Call]] so their [[Class]] should be "Object" instead. Or
> some implementation specific value, but if we're specifying things
> that are not interoperable anyway I think we can at least do the
> sensible thing.)

Not interoperable because IE probably won’t change their implementation
to work this way, or because most browsers won’t?

I would be happy to leave those [[Class]] properties implementation
specific, unless someone can come up with a reason it’d be useful to
have them standardised.

If they were to be specified though, I’d argue though that the interface
prototype objects needn’t have their [[Class]] set to the interface
name, as the built-in ECMAScript constructors’ prototype objects do.
For the built-in constructors, their prototype objects are actually
instances of the class themselves.  I don’t know that it would make
sense here to have, for example, a Node instance as the Node interface
prototype object.  Thus I’d be happy with "Object".

> > Any opinions on how to specify this?
>
> I'd wish to say I had a reasonable opinion. I do have an idea about it
> that is very similar to yours, but that would require a chaining
> together of prototype chains, which likely would mean that the
> multiple multilevel inheritance problem would have to be solved. I
> doubt we'd want to go into that. But if we indeed do want to go into
> that, the Python model makes best sense of all I've see so far. Just
> use it for prototypes instead of classes. The inheritance list itself
> doesn't have to be runtime resolved since it only applies to the DOM
> and not any ES objects, implementations would probably hardcode it for
> performance reasons.
> <uri:http://www.python.org/download/releases/2.3/mro/>

Thanks for the link. 

-- 
Cameron McCormack, http://mcc.id.au/
	xmpp:heycam@jabber.org  ▪  ICQ 26955922  ▪  MSN cam@mcc.id.au
Received on Wednesday, 6 June 2007 12:12:45 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Tuesday, 8 January 2008 14:18:57 GMT