<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On Aug 5, 2011, at 9:32 AM, Allen Wirfs-Brock wrote:</div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>I did something similar in my first go at this, but there is a problem...</div></div></div></blockquote></div><br><div>Right, the desugaring from class syntax is fragile and error-prone. </div></div></blockquote><div><br></div><div><div>I not so sure I agree.  It isn't obvious that this code pattern is particularly any more fragile, error prone, or less toolable than some of the class syntax alternatives that have been discussed.  Particular, if a programmer sets up an editor template that inserts:</div><div><font class="Apple-style-span" face="'Courier New'">const classname = subclass <| function ( ) {</font></div><div><font class="Apple-style-span" face="'Courier New'">   super.constructor();</font></div><div><font class="Apple-style-span" face="'Courier New'">   this.{</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">   };</font></div><div><font class="Apple-style-span" face="'Courier New'">}.prototype.{</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">}.constructor.{</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">};</font></div></div></div></div></blockquote><div><br></div>Let's count the hazards and costs:</div><div><br></div><div>1. No hoisted binding.</div><div><br></div><div>2. Boilerplate overhead of "const D = B <| function" vs. "class D extends B": 1+2+8=11 vs. 7 (ignoring spaces). Arrow function syntax helps but you still end up with <|...-> cussing.</div><div><br></div><div>3. As you already mentioned contra Axel, one cannot transpose .prototype. and .constructor. parts. Worse, if you don't have class methods, you have to end with a runt .constructor followed by a ;.</div><div><br></div><div>4. Braces required instead of no braces for section labels.</div><div><br></div><div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><div>It isn't clear why this is necessarily any more fragile (or less temptable) than for example:</div><div><br></div><div><div class="gmail_quote"><div><div><font face="'courier new', monospace">class classname extends superclass {</font></div><div class="im"><div><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">  constructor() {</span></div></div><div class="im"><div><div><font face="'courier new', monospace">    this.  =  ;</font></div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">  }</span></div></div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace; "><br></span></div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">prototype:</span></div><div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">class:</span></div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace; "><br></span></div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">}</span></div></div></div></div></div></div></div></div></blockquote><div><br></div>Really? Item (3) is a big hazard. Readability is harmed by the cussing and bracing. The class syntax may not be the best sugar, but it is sweeter and (due to the order requirement of .prototype. before .constructor., and the mandatory .constructor at the end if you don't have class methods) safer.</div><div><br></div><div>/be</div><br></body></html>