Subclassing an array and array methods
Allen Wirfs-Brock
allen at wirfs-brock.com
Fri Nov 11 08:33:53 PST 2011
My intent is to use a private name property to allow an object to provide a constructor for new "arrays" derived" from it. something along the lines of:
function createArraySubclass(proto,...values) {
return proto <| [...values].{
[Array.derivedArrayKey](){return proto<| [ ]}
}
}
The built-ins would create the derived collection by doing the equivalent of:
// assume |this| is the source collection
if (this[Array.derivedArrayKey]) A = this[Array.derivedArrayKey](); else A = [ ];
I can't just take the [[Prototype]] of the source array because that would introduce an incompatibility with existing code that uses these functions on non-Array objects. Also if we are generalizing these functions we shouldn't assume that all collections will what their derived collections to be "subclasses" of Array. They might want to allocate something else entirely.
Allen
On Nov 11, 2011, at 6:08 AM, Jake Verbaten wrote:
> In es-next we should be able to subclass an array
>
>> function createArraySubclass(proto, ...values) {
>> return proto <| [...values];
>> }
>
>
> However when we call `instanceOfSubArray.filter(...)` this method returns a new Array rather then a new SubArray.
>
> It would seem frustrating to have to overwrite all array methods that return arrays and make them return subarrays.
>
> Can we have array methods returning new instance of [[Prototype]] to make it easier to overwrite the build in?
>
> However this should only apply to true array subclasses. In the above example I would assume the [[Class]] of the object is Array. It should not apply to [].slice.call(arrayLikeObject)
>
> Do we have other situations where it would make sense to return an instance of whatever prototype your operation on rather then a hardcoded new X ?
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20111111/d06df6a2/attachment.html>
More information about the es-discuss
mailing list