<div dir="ltr"><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">Hi Allen,</div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">Thanks for the link. It seems that discussion is regarding an aesthetic concern of "foo = Foo()" being allowed when today "foo = new Foo()" is required. I assume these are entangled concerns but the issue James mentioned with DI and I've hit with multiple-inheritance are the restriction on ".call()" and ".apply()" being used on constructor functions.</div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">Is there a way to separate these? I see the use of "foo = Foo()" as a cosmetic (and therefore perhaps not worth a lot of effort) while the other holds more fundamental implications for DI and MI solutions.</div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><br></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div style="font-family:arial;font-size:small">Best,</div><div style="font-family:arial;font-size:small">Don</div><div style="font-family:arial;font-size:small">--</div><div style="font-family:arial;font-size:small">Don Griffin</div><div style="font-family:arial;font-size:small">Director of Engineering</div><div style="font-family:arial;font-size:small">Sencha, Inc.</div><div><font face="arial" size="2"><a href="https://www.sencha.com/" target="_blank">https://www.sencha.com/</a></font><br></div></div></div></div></div></div></div></div></div></div>
<br><div class="gmail_quote">On Thu, Jan 5, 2017 at 7:52 PM, 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 dir="auto">Notes on the most recent TC39 discussion of callable class constructors is at <div dir="auto"><div dir="auto"><div class="m_9041768261278212191elided-text"><a href="https://github.com/tc39/tc39-notes/blob/master/es7/2016-01/jan-28.md#progress-review-callable-class-constructors-allen" target="_blank">https://github.com/tc39/tc39-<wbr>notes/blob/master/es7/2016-01/<wbr>jan-28.md#progress-review-<wbr>callable-class-constructors-<wbr>allen</a></div><div class="m_9041768261278212191elided-text" dir="auto"><br></div><div class="m_9041768261278212191elided-text" dir="auto"> referring to this deck</div><div class="m_9041768261278212191elided-text" dir="auto"><br></div><div class="m_9041768261278212191elided-text" dir="auto"> <a href="https://github.com/tc39/tc39-notes/blob/master/es7/2016-01/callctr.pdf" target="_blank">https://github.com/tc39/tc39-<wbr>notes/blob/master/es7/2016-01/<wbr>callctr.pdf</a><br><blockquote style="margin:0 0 0 0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><br></div><div><br></div></div>
</blockquote></div><br></div></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Jan 5, 2017 9:31 AM, James Treworgy <<a href="mailto:jamietre@gmail.com" target="_blank">jamietre@gmail.com</a>> wrote:<br type="attribution"><blockquote class="m_9041768261278212191quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi - I am brand new to this list, I find myself here because of a confounding issue related to ES6 classes vs. traditional constructors. Forgive me if this is something that's been hashed out in times past. I looked around for discussion online and couldn't find anything more than the observation that the spec prohibits invoking it - not really any discussion. Probably a failing of google more than anything else, so if there's some discussion that I should read to catch up please point me there.<div><br>Here's my issue. The ES6 spec prohibits invoking class constructors without "new". This makes such functions a special case, e.g. </div><div><br></div><div>class Test() {}</div><div><br></div><div>// typeof Test === 'function'  // yep</div><div>// Test.prototype.constructor === Test // yep</div><div><br></div><div>// Test() => nope ... TypeError: Class constructor Test cannot be invoked without 'new'</div><div>// Test.call() ... nope</div><div>// Test.apply() ... nope</div><div><br></div><div>This has some interesting consequences. It means testing something for typeof "function" no longer guarantees it can be invoked without error. Also "function.toString()" can now return something that isn't actually a legal function definiton (since it returns the whole class as text). There seems to be no method, through various javascript reflection/invocation techniques or otherwise, to invoke a class constructor except by creating an instance of the class.</div><div><br></div><div>For tool-builders the consequences of this are significant. It's no longer possible to create something that can extend/wrap/act on a prototype by intercepting it's construction process, as it was before with plain ES5 constructors. So classes are fundamentally different than prototype contructors in how we can use them, far more than syntactic sugar. This has come into play lately for me, as an DI container we use that does exactly this doesn't work with ES6 classes (and as far as I can tell, there's no way to make it work, other than having devs no longer use class syntax).</div><div><br>This seems a strange design decision. Even conventional OO languages like C# have the capability to reflect on classes and access the constructor directly as a function. It seems to fly in the face of the basic openness/dyanamic nature of JavaScript, and more signficantly, creates a kind of backward incompatibility since a function is no longer just a function.</div><div><br></div><div>I'm wondering whether I'm missing some mechanism for legally accessing a class constructor as a function (other than parsing the output of toString() and eval!) -- and generally thoughts on this aspect of the ES6 specification.</div><div><br></div><div>Thank you!</div><div><br></div></div>
</blockquote></div><br></div></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>