<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Feb 5, 2015, at 9:07 PM, Kevin Smith <<a href="mailto:zenparsing@gmail.com" class="">zenparsing@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><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"><br class="">
Hopefully I’m wrong in that Foo.call(this) is illegal, but if it is, this is a devastating change, especially when traits are scheduled for ES7 or later.<br class=""></blockquote><div class=""><br class=""></div><div class="">Class constructors will now throw when called.</div><div class=""><br class=""></div><div class="">The changes to classes were fundamental but necessary to support subclassing of builtins (and future extensions to classes).</div><div class=""><br class=""></div><div class="">For mixins, can you move the initialization logic into a method (or a static method), instead of having it in the constructor?</div><div class=""><br class=""></div><div class="">    class M() {</div><div class="">        // methods</div><div class="">        static initialize(obj) { }</div><div class="">    }</div><div class=""><br class=""></div><div class="">    function ctor() {</div><div class="">        M.initialize(this);</div><div class="">    }</div><div class=""><br class=""></div><div class="">    // etc.</div><div class=""><br class=""></div><div class="">Is this a viable pattern for traits/mixins?</div></div></div></div>
</div></blockquote></div><br class=""><div class="">With the code example I provided Foo is the class, not the mixin. Foo needs to be copied so traits can be added to it.</div><div class=""><br class=""></div><div class="">Here’s an example:</div><div class=""><br class=""></div><div class="">class Foo {}</div><div class="">class Fooy extends mixin(Foo, SomeTrait) {}</div><div class=""><br class=""></div><div class="">“Foo” needs to be copied and the methods from SomeTrait needs to be added to the copy’s prototype, which Fooy then extends.</div><div class=""><br class=""></div><div class="">This is how you would traditionally copy a “class” (pre-es6 rev32):</div><div class=""><br class=""></div><div class="">class Foo {<br class="">   constructor() {}<br class="">}</div><div class=""><div class="">function copy(classObject) {</div><div class=""><span class="Apple-tab-span" style="white-space:pre">     </span>function ctor() {</div><div class=""><span class="Apple-tab-span" style="white-space:pre"> </span>   Foo.call(this);</div><div class=""><span class="Apple-tab-span" style="white-space:pre">   </span>}</div><div class=""><span class="Apple-tab-span" style="white-space:pre"> </span>ctor.prototype = Object.create(classObject.prototype);</div><div class=""><span class="Apple-tab-span" style="white-space:pre">    </span>ctor.prototype.constructor = ctor;</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>return ctor;</div><div class="">}</div></div><div class=""><br class=""></div><div class="">Although, after some discussion in a 6to5 issue, this may (hopefully) be legal:</div><div class=""><br class=""></div><div class="">class Foo {<br class="">   constructor() {}<br class="">}</div><div class=""><div class="">function copy(classObject) {</div><div class="">    return class extends classObject {};</div><div class="">}</div></div><div class=""><br class=""></div><div class="">As long as the prototype of the class can still be modified, that should work.</div><div class=""><br class=""></div><div class="">--</div><div class="">Luke</div><div class=""><br class=""></div></body></html>