<div dir="ltr"><div>> <span style="font-size:12.8px">I also don't see how decorators can solve it.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">Making to wrapper for class constructor to allow the constructor to callable would be fairly straightforward, e.g.<br><br>```</span></div><div><span style="font-size:12.8px">function callable(cls) {<br>  </span><span style="font-size:12.8px">function Wrapper(...args) {<br>    </span><span style="font-size:12.8px">return Reflect.construct(cls, args, new.target || cls);<br>  }<br>  Object.defineProperty(Wrapper, "name", { value: <a href="http://cls.name">cls.name</a> });</span></div><div><span style="font-size:12.8px">  Object.setPrototypeOf(</span><span style="font-size:12.8px">Wrapper</span><span style="font-size:12.8px">, cls);</span><br style="font-size:12.8px"><span style="font-size:12.8px">  </span><span style="font-size:12.8px">Wrapper</span><span style="font-size:12.8px">.prototype = cls.prototype;<br></span><span style="font-size:12.8px">  return </span><span style="font-size:12.8px">Wrapper</span><span style="font-size:12.8px">;<br>}<br><br>const </span><span style="font-size:12.8px">Example = </span><span style="font-size:12.8px">callable(</span><span style="font-size:12.8px">class Example {});</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">Example();<br>```</span></div><div><span style="font-size:12.8px">and thus potentially<br>```<br>@callable<br>class Example {}<br>```</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">I know you said "</span><span style="font-size:12.8px">At the cost of non-zero overhead." but it seems like this would be something engines could optimize more easily than proxies. </span></div><div><br></div>> <span style="font-size:12.8px">This seems like a really short sighted issue.  Why can't calling a class just invoke it's constructor?<br><br>I think the big question for me when discussing this with people is, is it more surprising to throw a clear error in these case, or to do something close but not quite the same as if it were an ES5-style constructor?<br><br>```<br>class Foo {<br>  constructor() {<br>    this.foo = 4;<br>  }<br>}<br><br>var obj = {};<br>var inst = Foo.call(obj);<br><br>// what happens?</span><div><span style="font-size:12.8px">// obj.foo => 4 or undefined </span></div><div><span style="font-size:12.8px">// inst => obj, new object, or undefined</span></div><div><span style="font-size:12.8px">// inst.foo => 4 or undefined</span></div><div><span style="font-size:12.8px">```<br>To be consistent with ES6 class semantics it has to be that a new instance is returned and `obj` is 100% ignored</span><span style="font-size:12.8px"> but that are very much not what you'd get if you replaced the class there with `function Foo(){ this.foo = 4; }`. Isn't that its own set of confusing changes?</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">Specifically for "</span><span style="font-size:12.8px">This seems like a really short sighted issue" I'd say this is the opposite of short-sighted. There's nothing preventing support for this in the future, but if it got added with a behavior that ended up confusing people _more_ than not having it at all, then we'd be stuck with it for good.</span></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Nov 5, 2017 at 11:53 AM, J Decker <span dir="ltr"><<a href="mailto:d3ck0r@gmail.com" target="_blank">d3ck0r@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"><br><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Sun, Nov 5, 2017 at 7:53 AM, Andrea Giammarchi <span dir="ltr"><<a href="mailto:andrea.giammarchi@gmail.com" target="_blank">andrea.giammarchi@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">oldie but goldie ?<div><br></div><div>```js</div><div>Object.defineProperty(</div><div>  Function.prototype,</div><div>  'new',</div><div>  {</div><div>    configurable: true,</div><div>    value(...args) {</div><div>      return new this(...args);</div><div>    }</div><div>  }</div><div>);<br></div><div>```</div><div><br></div></div></blockquote></span><div>doesn't make new optional, just moves it, and doesn't apply to 'class'es which the OP is saying.</div><span class=""><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="m_4614282652319762650h5">On Sun, Nov 5, 2017 at 11:28 AM, Oriol _ <span dir="ltr"><<a href="mailto:oriol-bugzilla@hotmail.com" target="_blank">oriol-bugzilla@hotmail.com</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_4614282652319762650h5">




<div dir="ltr">
<div id="m_4614282652319762650m_2461686031983509512m_7205693779373391279divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif" dir="ltr">
<div><span>> Why can't `new` be optional?<br>
<br></span>
When you call a function, you are using the internal [[Call]] method. When you use the `new` operator, it's the internal [[Construct]] method.<br>
<br>
They are different things, so IMO avoiding `new` when you are instantiating is bad practice.<br>
<br></div></div></div></div></div></blockquote></div></div></blockquote><div><br></div></span><div>Of course it is... with out new, classes throw an exception.</div><div><br></div><div>This seems like a really short sighted issue.  Why can't calling a class just invoke it's constructor?</div><div><br></div><div>I also don't see how decorators can solve it.</div><div><br></div><div>Seems just as arbitrary as the underscore proposal not accepting underscore trailing a number or before or after a decimal.</div><div><br></div><div>Maybe, it would be better to ask 'Why does calling a class throw an exception instead of just creating a new instance.</div><span class=""><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_4614282652319762650h5"><div dir="ltr"><div id="m_4614282652319762650m_2461686031983509512m_7205693779373391279divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif" dir="ltr"><div>
But if you really want to avoid `new` when using ES6 `class` syntax, you can use proxies, e.g.<br>
<br>
```js<br>
let MyClass = new Proxy(class MyClass {<br>
  constructor(arg) { this.arg = arg; }<br>
}, {<br>
  apply: (target, thisArg, args) => Reflect.construct(target, args)<br>
});<br>
MyClass(1); // { arg: 1 }<br>
new MyClass(2); // { arg: 2 }<br>
```</div></div></div></div></div></blockquote></div></div></blockquote><div><br></div></span><div>At the cost of non-zero overhead.</div><span class=""><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_4614282652319762650h5"><div dir="ltr"><div id="m_4614282652319762650m_2461686031983509512m_7205693779373391279divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif" dir="ltr"><div><span class="m_4614282652319762650m_2461686031983509512HOEnZb"><font color="#888888">
--Oriol</font></span></div>
</div>
</div>

<br></div></div><span>______________________________<wbr>_________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listi<wbr>nfo/es-discuss</a><br>
<br></span></blockquote></div><br></div>
<br>______________________________<wbr>_________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listi<wbr>nfo/es-discuss</a><br>
<br></blockquote></span></div><br></div></div>
<br>______________________________<wbr>_________________<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" rel="noreferrer" target="_blank">https://mail.mozilla.org/<wbr>listinfo/es-discuss</a><br>
<br></blockquote></div><br></div>