- From: liorean <liorean@gmail.com>
- Date: Wed, 6 Jun 2007 11:26:49 +0200
- To: "Web APIs WG (public)" <public-webapi@w3.org>
> Cameron McCormack wrote: > > 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 On 06/06/07, Boris Zbarsky <bzbarsky@mit.edu> wrote: > What Gecko does is to put all properties for all the interfaces an object > implements onto the "closest" prototype object. So if you have a <div>, > HTMLDivElement.prototype will have all the properties the <div> is supposed to > have defined directly on it. Is this the reason for: var div=document.createElement('div'), span=document.createElement('span'), text=document.createTextNode('What am I?'); Function.prototype.call.call(div.appendChild,span,text); text.data+='\r\n'+text.parentNode.tagName; failing with an uncaught exception in Gecko but not in any other browser? With the following modification it succeeds with matching behaviour to Presto and WebKit: var dd=document.createElement('dd'), dt=document.createElement('dt'), text=document.createTextNode('What am I?'); Function.prototype.call.call(dd.appendChild,dt,text); text.data+='\r\n'+text.parentNode.tagName; If so, is there any possibility of making that work? I can understand not allowing e.g. applying the same appendChild implementation to work on both Element and Attr objects, but not allowing it on other element objects seems a bit limiting to me. > The prototype chain in Gecko basically follows the inheritance model in the DOM > spec: HTMLDivElement.prototype.[[Prototype]] === HTMLElement.prototype, etc. > Things like EventTarget are off to the side somewhere as in your imagined way to > handle it. > > As a result, given a <div> object (call it "div"), > > div.[[Prototype]] === HTMLDivElement.prototype > HTMLDivElement.prototype.[[Prototype]] === HTMLElement.prototype > div.appendChild === HTMLDivElement.prototype.appendChild > > are all true, while > > div.appendChild === HTMLElement.prototype.appendChild > > is false. As a result, to change what the appendChild of a <div> is you have to > change it on HTMLDivElement.prototype. Is there any compelling reason why HTMLElement.prototype.appendChild === HTMLDivElement.prototype.appendChild isn't true in Gecko? I.e. is there a good reason to not use the same implementation of the function on all Element derived interfaces even if it's located on different interface objects? > Of course all of this is subject to change, and in fact is likely to change some > time in the not too distant future. > > To be honest, do we really think that specifying the exact prototype chain is > desirable? How likely are UAs to rework the mappings between their native code > and ECMAScript to follow said spec? Well, I think developers are more interested in the prototype hierarchy actually working for augmenting browsers as well as Function.prototype.call and Function.prototype.apply actually working on DOM methods in a natural way for ES than they are in any specific prototype hierarchy. -- David "liorean" Andersson
Received on Wednesday, 6 June 2007 09:26:56 UTC