<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 19 January 2015 at 22:41, Fabrício Matté <span dir="ltr"><<a href="mailto:ultcombo@gmail.com" target="_blank">ultcombo@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span class=""><span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>In that case, we can expect that users will want to implement "factory when called" as a default behavior for their classes.  From that, we can foresee that the following pattern:</div><div><br></div><div>    if (!new.target) return new Whatever(...args);</div><div><br></div><div>will become a kind of boilerplate.  Obviously, we want to avoid boilerplate as a general rule.  </div></div></div></div></blockquote><div><br></div></span></span><div>+1!<br><br>I personally consider `new` as user code pollution.<br></div><div>I have been considering to use classes but export factories in my libraries and packages' code. The initial idea was:</div><div><br></div><div>```js</div><div><div>class Foo {/*...*/}</div><div><br></div><div>module.exports = function(...args) {</div><div><span style="white-space:pre-wrap">   </span>return new Foo(...args);</div><div>};</div></div><div>```<br><br>But the sample above has obvious problems:</div><div><br></div><div>1. It becomes a tedious boilerplate to wrap every single class into a function export;</div><div>2. It can't be transpiled to ES5. Rest parameters are transpiled to `.apply()` which can only do [[Call]] and not [[Construct]].</div><div><br></div></div></div></div></div></div></blockquote><div><br></div><div>Point 2 is incorrect (e.g. `new (Foo.bind.apply(Foo, [undefined].concat(args)))`).</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div></div><div>(forgot to CC es-discuss before oops, let's see if this forward goes correctly now)</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>/fm</div></font></span></div></div></div></div></div>
<br>_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
<br></blockquote></div><br></div></div>