<div dir="ltr"><br><div class="gmail_extra"><div class="gmail_quote">On Mon, Jun 24, 2013 at 9:31 AM, Allen Wirfs-Brock <span dir="ltr"><<a href="mailto:allen@wirfs-brock.com" target="_blank">allen@wirfs-brock.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im"><br>
On Jun 24, 2013, at 8:42 AM, Jason Orendorff wrote:<br>
<br>
> According to the January 30 meeting notes, Array.from is getting<br>
> optional map functionality.[1]<br>
><br>
> This is motivated by the following example:<br>
><br>
>    class V extends Array {<br>
>        constructor(...args) {<br>
>            super(...args);<br>
>        }<br>
>    }<br>
><br>
>    var v, m;<br>
>    v = new V(1, 2, 3);<br>
>    m = v.map(val => val * 2);<br>
>    console.log( m instanceof V ); // false :(<br>
><br>
> Of course changing Array.from doesn't fix this; v.map() still returns<br>
> an Array, same as before. And there was already an easy workaround:<br>
>    m = V.from(v.map(val => val * 2));<br>
<br>
</div>The issues (and discussion) is more complex then the above indicates.<br>
<br>
The root issue concerns what should Array producing methods such as Map produce when used in an Array subclass. Should the result be an Array instance (as it currently is in ES5) or should it be a new instance of the subclass.  If the latter, how is the actual subclass determined.<br>
</blockquote><div><br></div><div>If the `map` method is inherited and is called directly on the instance of the inherited class, then probably it's more logical to return the instance of the same inheriting class (i.e. the V).<br>
<br></div><div>To answer your question how the determination of the subclass should happen -- first need to ask what is the [[NativeBrand]] says for "v" instance? Is it still "NativeArray" (shouldn't be IMO, will clarify in the spec later)?<br>
<br></div><div>Can you use the [[NativeBrand]] check or at very least `constrcutor` property check (which though, not that safe maybe). Will it actually make sense to set the [[NativeBrand]] to the name of the class?<br><br>
</div><div>if (Array.isArray(this)) {<br></div><div>  var result = [];<br></div><div>} else {<br></div><div>  var result = new this.constructor(<somehow_get_the_default_args>?);<br></div><div>}<br></div><div><br></div>
<div>But again there is an issue with determination of the default arguments of the constructor, though can fallback to defaults.<br></div><div><br></div><div>Dmitry<br></div></div><br></div></div>