- From: Cameron McCormack <cam@mcc.id.au>
- Date: Wed, 27 Jul 2011 23:07:05 -0700
- To: Alex Russell <slightlyoff@google.com>
- CC: public-script-coord@w3.org, Brendan Eich <brendan@mozilla.com>
Hi Alex. On 27/07/11 2:24 PM, Alex Russell wrote: > The topic of WebIDL's last call just came up at the TC39 face-to-face, > and one issue I've flagged but not posted here yet is the topic of > non-constructible constructors. Section 4.3.5 contains an explicit > example of a behavior that I'd like to see repaired: > > // from: http://www.w3.org/TR/2011/WD-WebIDL-20110712/#Constructor > var z = new NodeList(); // This would throw a TypeError, since no > // [Constructor] is declared. > > Browsers expose many of these (HTMLDivElement, etc.) and from the > integration-with-ES perspective, they're mostly warts, not least of > all because they co-exist with *actually* constructible constructors > (Image, etc.). Yes. > I'd like to propose that instead of blessing the non-constructible > behavior that the lack of a [Constructor] *not* create a throwing > function, but instead create a regular factory in the style of Image. So this would eliminate the need for [Constructor], since all interface objects would be constructable? Does this make sense? (I agree it would be great for interface objects like HTMLDivElement and NodeList to be constructable. (Well, maybe not NodeList, unless it gained functionality -- it would be useless without the ability to manually add Nodes into it.)) > On the topic of Arrays, I know it has come up before that there are > DOM collection types, in particular NodeList, which should be Array > subclass instances. I know that's outside the specifics of WebIDL, but > I'd like to make sure that there's at least some accommodation in > WebIDL for making this expressible until TC39 finishes the work of > making it possible to directly subclass Array. Perhaps my reading has > missed some infrastructure that might imply this or at least prevent > it from being possible in an extension today? The infrastructure does not exist in Web IDL still. One kind of object *does* get the Array prototype object in its prototype chain, and that is "array platform objects" (formerly "array host objects"; name subject to improvement). If you have: interface A { long[] f(); }; then the returned object will be an object with [[GetOwnProperty]] and [[DefineOwnProperty]] internal methods that cause it to look like a dense array of Number values, and whose [[Prototype]] is Array.prototype. I realise what you want is for objects of particular interfaces -- which have their own methods -- to be able to inherit from Array.prototype. Now that we have the <| proposal, this (as well as the array platform object above) seems more feasible from a "let's implement the DOM in JS" perspective. I think we should get agreement from the editors of DOM Core that that is what they want to do with NodeList and HTMLCollection. If they do indeed want to do that (and I do agree it would be good), then someone can send in a LC comment on Web IDL requesting the ability to define these array-like interfaces. Thanks, Cameron
Received on Thursday, 28 July 2011 06:07:51 UTC