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

Re: Non-constructible constructors and Arrays

From: Jonas Sicking <jonas@sicking.cc>
Date: Thu, 28 Jul 2011 19:25:45 -0700
Message-ID: <CA+c2ei_wa5WTiO5vh6Nam0QeFXfc15vz1xyHHEt=RASNYESX-g@mail.gmail.com>
To: Allen Wirfs-Brock <allen@wirfs-brock.com>
Cc: Alex Russell <slightlyoff@google.com>, public-script-coord@w3.org, Brendan Eich <brendan@mozilla.com>, Cameron McCormack <cam@mcc.id.au>
On Thu, Jul 28, 2011 at 7:12 PM, Allen Wirfs-Brock
<allen@wirfs-brock.com> wrote:
>
> On Jul 28, 2011, at 5:04 PM, Jonas Sicking wrote:
>
>> As I asked above, what would the mutating functions do to "live"
>> NodeList? And IMHO only APIs that want to return "live" objects should
>> return NodeLists. Others should simply return arrays.
>>
>>
>
> In ES5 all of the Array.prototype functions are defined to operate upon generic objects with "array indexed" (ie, integer string values) properties. The objects they operate upon do not need to be Array instances. The functions are specified in terms of the basic ES5 internal operations such as [[Get]], [[Put]],  etc.  Such generic objects (or even Array instances for that matter) may, in ES5, have non-writable and non-deletable properties and the objects may be non-extensible.  For that reason, the array algorithms all explicitly define how to deal with such situations.  Generally, they throw when they try to modify a property in a manner that is forbidden for that object.
>
> If a DOM implementation provides reasonable implementations of [[Get]], [[Put]] and friends then the Array functions should just work on its DOM objects. Trying to reverse a read-only DOM object may not do anything useful, but its unuseful behavior would still be fully specified.

I'm very aware how the Array functions are defined. The problem is
that there aren't any reasonable defaults we could provide for
NodeList's [[Put]] operations simply due to what a NodeList
represents.

The only reasonable thing we could do is to make all mutating
operations throw, which frankly would be a pretty strange API. I.e.
all NodeLists would have whole host of operations like .push and
.shift which always would throw. It would seem much better if those
operations weren't there.

This discussion has come up a number of times and the conclusion is
always the same. Several solutions have been proposed, some more
workable than others, but unfortunately this thread doesn't mention
any of them, nor does it bring up any new information which would help
us get any closer to a conclusion.

/ Jonas
Received on Friday, 29 July 2011 02:27:00 UTC

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