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
[email protected]
https://mail.mozilla.org/listinfo/es-discuss