- From: Travis Leithead <travil@windows.microsoft.com>
- Date: Sun, 23 Mar 2008 15:02:02 -0700
- To: Garrett Smith <dhtmlkitchen@gmail.com>, Jonas Sicking <jonas@sicking.cc>
- CC: "Web APIs WG (public)" <public-webapi@w3.org>
Mmm. Good points all. Allowing them to be factory methods is rather interesting.
-----Original Message-----
From: Garrett Smith [mailto:dhtmlkitchen@gmail.com]
Sent: Wednesday, March 19, 2008 10:23 AM
To: Jonas Sicking
Cc: Travis Leithead; Web APIs WG (public)
Subject: Re: [Bindings] 'new' behavior on interface objects
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 Sunday, 23 March 2008 22:02:12 UTC