On Jun 10, 2015, at 9:16 AM, C. Scott Ananian wrote:

> On Wed, Jun 10, 2015 at 11:46 AM, Domenic Denicola <d...@domenic.me> wrote:
> Regardless of whether or not you agree, that was the original motivation for 
> its introduction.
> 
> 
> https://twitter.com/awbjs/status/535962895532584960 says:
> ES6 final tweaks #8: Smalltalk-like species pattern used in Array methods, 
> etc. to determine constructor for derived objects.
> https://esdiscuss.org/notes/2014-11-18 discusses species in the context of 
> `Array.prototype` methods.
> And https://esdiscuss.org/notes/2014-11-19 says:
> Allen Wirfs-Brock: Smalltalk uses an abstract above that has a species 
> property to determine what to create.
> 
> That's all I know of it.  I wasn't there, obviously, and you were.  But this 
> is the first I've ever heard of using @@species for constructor signature 
> modification.  It's hard to reconstruct reasoning from meeting notes and 
> tweets.

That's correct.  `species` is intended for use when a subclass constructor 
wants to use something other than itself as the constructor for objects derived 
from the subclass instances.  Using `species` to select a constructor higher in 
a class hierarchy for derived instances is a fine thing to so.  For example, a 
"SortedArray" might choose that operations like `map` should produce the more 
general Array instances rather than SortedArray instances.

Using `species` to modify constructor signatures was not one of its intended 
use-cases, however, it might be possible to use it for that purpose.

Note that the uses of `species` in the ES6 spec all assume that the signature 
of the returned constructor is the same as the base class constructor. 

However, a way around that might be to have a `species` method that was an 
adaptor of the expected constructor signature to some other signature pattern. 

For example, 
   
  LabelledPromise[Symbol.species] = function() {
       ctor = this;
       return function(executor) {
            if (new.target === undefined) throw TypeError("Can't call a class 
constructor");
            return Reflect.construct(ctor, [ctor.defaultLabel, executor], 
new.target)
       }
  };
LabelledPromise.defaultLabel = "default label";

Allen
 





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

Reply via email to