W3C home > Mailing lists > Public > public-script-coord@w3.org > July to September 2011

Re: Non-constructible constructors and Arrays

From: David Flanagan <dflanagan@mozilla.com>
Date: Thu, 28 Jul 2011 15:42:48 -0700
Message-ID: <4E31E5E8.3080704@mozilla.com>
To: Alex Russell <slightlyoff@google.com>
CC: Cameron McCormack <cam@mcc.id.au>, public-script-coord@w3.org, Brendan Eich <brendan@mozilla.com>
On 7/28/11 2:18 PM, Alex Russell wrote:
> On Thu, Jul 28, 2011 at 12:11 PM, David Flanagan<dflanagan@mozilla.com>  wrote:
>> On 7/28/11 11:35 AM, Alex Russell wrote:
>>> On Wed, Jul 27, 2011 at 11:07 PM, Cameron McCormack<cam@mcc.id.au>    wrote:
>>>
>>>> So this would eliminate the need for [Constructor], since all interface
>>>> objects would be constructable?
>>> Yep!
>> Don't you still need [Constructor] for declaring constructors that take
>> arguments?  Image has multiple constructors, for example (though it uses
>> NamedConstructor to declare them since the interface name is
>> HTMLImageElement).
> My only proposal here is that in the absence of [Constructor], one is
> provided for you, it's not meant to preclude allowing more and more
> expressive constructors with better argument handling.
When Cameron wrote "eliminate... [Constructor]" I thought he meant to 
eliminate it from WebIDL.  Now I think I understand: your proposal would 
simply eliminate the need for a bare [Constructor] declaration on the 
interfaces that currently use it because they could leave it out and get 
it by default.   With that clear, all of my points about constructors 
with arguments don't make any sense, since they could still be declared 
with [Constructor(...)] as they are now.

>> And what about interfaces for which a no-arg constructor is not wanted?
> It's JS. Passing no args is the special case of passing args.
>
>>   If
>> you're going to create Text nodes with a constructor instead of
>> document.createTextNode(), for example, you want a constructor that takes a
>> string argument.  You don't want to have to use a no-arg constructor and
>> then set the data property of the resulting object.
> Right, but it shouldn't blow up. These should be equivalent:
>
>    var blank        = new Text("");
>    var alsoBlank = new Text();

I brought up the Text example because I thought your proposal would not 
allow a Text constructor with an argument to be declared.  Now I see 
that this is just a DOMCore issue.  You'd like that spec to declare the 
Text interface with [Constructor(optional DOMString)], and then the 
specification text for that constructor to say what to do if the 
argument was omitted...  I think WebIDL already provides everything 
needed here.

>>   So if you make creating
>> a no-arg constructor the default, then I think you also need to add a
>> [NoDefaultConstructor] attribute to WebIDL
>>
>> Also: What would happen for interfaces declared [NoInterfaceObject] and
>> [Callback]?  Both of those would imply [NoDefaultConstructor], right?
> I'm pretty sure that there's no need for [NoDefaultConstructor]. We
> just need to explain the JS-side results if passing no args to the
> ctor when you specify ctors that would otherwise take them.
But there must be *some* interfaces for which no constructors (with or 
without arguments) are desired...  Perhaps the set of interfaces that do 
not want constructors is identical to the set that is currently declared 
[NoInterfaceObject] or [Callback]

>>> It also opens the door for overdue fixes, like defining the arguments
>>> these constructors should take, the document object that owns them,
>>> and starting the discussion about how to give them shorter names = )
>> WebIDL already allows constructor arguments to be defined.
> My point was only that we need to do the work of defining what good,
> useful args for Node and Element ctors should be. Yes, that's work for
> DOM to do, but WebIDL lays the groundwork here.
Ah.  Sorry; I thought you were talking about WebIDL rather than DOM Core...

>> Setting the ownerDocument correctly seems like a serious problem for default
>> constructors for nodes.
> Nah. Image muddles through just fine. In any case, we can provide ways
> to accomodate it, either through de-reference (getter-style):
>
>     new d = new otherdoc.Div(...);
Are you actually proposing to define DOM constructors on the document 
object?  I kind of like that idea, but I assume you meant otherwin 
rather than otherdoc in the above...  Of course that doesn't work for 
documents created by document.implementation.createHTMLDocument(), since 
they don't have windows.

> or by allowing the document to be passed into the args:
>
>     var d = new Div({ ownerDocument: otherdoc });
Right, and if you take this approach, then the DOM Core and HTML 
specifications will have to explicitly define [Constructor] attributes 
that specify the arguments.  So none of the Node subtypes (including all 
of the HTML*Element interfaces) would benefit from your create a default 
no-arg constructor if none is explicitly specified proposal.

I am not a spec writer, but it seems to me that since spec writers will 
have to write paragraphs of prose describing what each constructor does, 
it would actually be nicer to have those constructors explicitly 
declared in the IDL.  Then, for example, the constructor declaration can 
be hyperlinked to the prose that defines what it does.  With 
constructors created by default, spec authors will just have to remember 
to define the behavior of this important function that has no IDL 
representation.

Adding constructors to all the DOM interfaces will be a non-trivial 
amount of work for the spec authors.  It doesn't seem to me that 
modifying WebIDL to define constructors even without a [Constructor] 
declaration reduces that amount of work required in any substantial way.
> I don't know what you mean about shorter names.  WebIDL already gives spec
> authors the ability to use NamedConstructor to define shorthand factory
> names like Image() and Audio().
> Again, not WebIDL's problem per sae, but "HTMLDivElement" sucks vs.
> "Div". Image and Audio are good precedents for Doing It Right (TM).
For web compatibility, you're not going to be able to do away with 
HTMLDivElement, are you?  How about just leaving it alone as a 
non-constructor and adding a Div() constructor?   (Though it seems like 
adding one constructor to the Window object per HTML tag is going to 
break existing code...)

And given that WebIDL already has [NamedConstructor], this is basically 
a job for DOMCore and HTML, right?

One WebIDL issue that might be worth changing is to require named 
constructors to have the same prototype object as the current interface 
object.  For example, WebIDL should probably require that:

       Image.prototype === HTMLImageElement.prototype

Currently this comparison is false in both FF and Chrome.

     David
Received on Thursday, 28 July 2011 22:43:17 UTC

This archive was generated by hypermail 2.3.1 : Wednesday, 8 May 2013 19:30:04 UTC