On Nov 11, 2011, at 10:52 AM, Axel Rauschmayer wrote:

> Got it, related to what you solve in generic classes with This-types 
> (covariance vs. contravariance...).
> 
>    // assume |this| is the source collection
>    if (this[Array.derivedArrayKey]) A = this[Array.derivedArrayKey](); else A 
> = [ ];
> 
> Another possibility:
> 
>    if (this[Array.derivedArrayKey]) {
>        A = this[Array.derivedArrayKey]();
>    } else if (typeof this.constructor === "function") {
>        A = new this.constructor();

In Smalltalk the default implementation of species is:
species
   ^self class

which is pretty much the moral equivalent of:  this.constructor.

However, that might introduce backwards compatibility issues for existing code 
which has constructors but currently always produces Array instances from these 
functions. 
 
>    } else {
>        A = [ ];
>    }
> 
> Creating a subclass this way (i.e., using @derivedArrayKey) produces code 
> whose meaning is more obvious (to me) than the code below.

I just wanted to dash out the most directly extensions of Jake's original code 
that would exhibit the concept.  Ultimately, it's a matter of defining a method 
using which ever formulation you prefer (and which gets adopted into the 
language)

> 
>>>> function createArraySubclass(proto,...values) {
>>>>  return proto <| [...values].{
>>>>        [Array.derivedArrayKey](){return proto<| [ ]}
>>>>  }
>>>> }

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

Reply via email to