- From: Garrett Smith <dhtmlkitchen@gmail.com>
- Date: Wed, 19 Mar 2008 10:23:12 -0700
- To: "Jonas Sicking" <jonas@sicking.cc>
- Cc: "Travis Leithead" <travil@windows.microsoft.com>, "Web APIs WG (public)" <public-webapi@w3.org>
On Wed, Mar 19, 2008 at 9:12 AM, Jonas Sicking <jonas@sicking.cc> wrote: > > > Travis Leithead wrote: > > Since this spec is presumably creating a language binding for JavaScript, (and assuming interface objects are Functions, as seen by Opera), then why does: > > > > var div = new HTMLDivElement(); > > > > produce a script error? > > > > Seems like a perfectly valid thing to do, essentially a shortcut to document.createElement('div') > > The problem is that this doesn't make sense for lots of interfaces. What > does > > var a = new HTMLElement(); > > do for example? And while there might only be one object that implement > HTMLDivElement right now, who's to say that is true in the future. > > As it so happens there are actually at least 2 objects in firefox that > implement that interface, a HTML <div> and an XHTML <div> (they differ > in case sensitivity handling), which one should be instantiated by your > code? > A Factory allows subclasses to define which classes to instantiate, as Jonas mentioned. In this case: HTML document and XHTML document. The design of a Factory method allows for implementation details for complex operations (creating a SCRIPT or IMG, or XXXTAG_NOT_IMPLEMENTED, or branches for categories of elements). Creating a constructor would make browser implementation code a lot more complicated, I imagine, though Jonas would know better than I do about that. Factory Method was a good choice over Constructor here. Exposing a constructor of the same name as the interface - what, besides compatibility problems, would that acheive? The result would be exposed objects - Element - for example, that might or might not create an element, depending on the browser. Each javascript call to new Element would have to be wrapped in a try-catch, as there is no way to determine if the object in question - Element - implemented [[Construct]] and, currently, at least 3 browsers expose an object of a name corresponding to the interface and none of them implement [[Construct]]. Garrett > / Jonas > >
Received on Wednesday, 19 March 2008 17:23:45 UTC