- From: Cameron McCormack <cam@mcc.id.au>
- Date: Wed, 6 Jun 2007 14:36:46 +1000
- To: public-webapi@w3.org
Hi everyone. What should the prototype chain for an object that implements multiple interfaces looks like? A single interface is simple enough: 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 } nl = { an object } nl.[[Prototype]] = NodeList.prototype What happens if an object implements multiple interfaces, e.g. an Element that is also an EventTarget? I can imagine a way to handle this with prototypes, for example: Node = { an object } Node.[[Prototype]] = Object prototype object Node.prototype = { an object } Node.prototype.constructor = Node Element = { an object } Element.[[Prototype]] = Object prototype object Element.prototype = { an object } Element.prototype.[[Prototype]] = Node.prototype Element.prototype.constructor = Element EventTarget = { an object } EventTarget.[[Prototype]] = Object prototype object EventTarget.prototype = { an object } EventTarget.prototype.constructor = EventTarget elt = { an object } elt.[[Prototype]] = { an object } elt.[[Prototype]].[[Prototype]] = null elt.[[Prototype]].[[Get]](P): 1. If O doesn’t have a property with name P, go to step 4. 2. Get the value of the property. 3. Return Result(2). 4. Call the [[HasProperty]] method of the Element prototype object. 5. If Result(4) is true, go to step 9. 6. Call the [[HasProperty]] method of the EventTarget prototype object. 7. If Result(6) is true, go to step 11. 8. Return undefined. 9. Call the [[Get]] method of the Element prototype object. 10. Return Result(9). 11. Call the [[Get]] method if the EventTarget prototype object. 12. Return Result(11). The same question could apply to multiple inheritance (which is allowed by OMG IDL, but AFAIK is not used in any of the DOM specs). This is probably not what browsers do in practice, though. For example, Opera 9 has an addEventListener method directly on the Node interface prototype object (see http://mcc.id.au/2007/05/binding-tests/#t008), presumably because all Node objects in a document also implement EventTarget. Any opinions on how to specify this? Thanks, Cameron -- Cameron McCormack, http://mcc.id.au/ xmpp:heycam@jabber.org ▪ ICQ 26955922 ▪ MSN cam@mcc.id.au
Received on Wednesday, 6 June 2007 04:36:58 UTC