On Nov 11, 2011, at 9:47 AM, Axel Rauschmayer wrote:

>> function createArraySubclass(proto,...values) {
>>   return proto <| [...values].{
>>         [Array.derivedArrayKey](){return proto<| [ ]}
>>   }
>> }
> 
> I’m curious: Why wouldn’t one extend Array, instead?

the problem is with built-ins like Array.prototype.filter that produce a new 
collection object.  Today the new collection is always an Array, but for some 
operations you would really like the new collection to be the same kind of 
collection as original collection or something other than Array.

In Smalltalk (and I believe  self) this is done by collections having a methods 
named "species" that returns the class that should be used to create the new 
collection.  Part of the design of a new collection class is the assignment of 
its "species".  In my sketch above, a call to the private derivedArray method 
is the equivalent to saying:
   self species new
in Smalltalk.

So, if I have an object created by creteArraySubclass and say:

let f = obj.filter(function(element) {return isGood(element)});

then f will be an instance of the array subclass rather than a direct instance 
of Array.

This also would work if obj was any generic array-like collection that had a 
derivedArray method.  Even if the collection didn't inherit from Array.prototype

let f = [].filter.call(obj,function(element) {return isGood(element)});

If the built-in Array prototype functions were respecified to use 
elementGet/elementSet from 
http://wiki.ecmascript.org/doku.php?id=strawman:object_model_reformation 
instead of [[Get]]/[[DefineOwnProperty]] to process elements then those 
functions would work with any collection that had integer indexed keyed data 
elements.

Allen



_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to