<br>On Thu, May 19, 2011 at 3:08 PM, Brendan Eich <span dir="ltr"><<a href="mailto:brendan@mozilla.com">brendan@mozilla.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div style="word-wrap:break-word"><div><div class="im"><div><span class="Apple-style-span" style="font-family: Courier; ">class Point {</span></div></div><div><div><font face="Courier">  x = 0;</font></div><div><font face="Courier">  ...</font></div>

<div><font face="Courier">}</font></div><div><br></div><div>is a bit of a mystery.</div><div><br></div><div>Is it an assignment expression-statement? No, no statements as <i>ClassElements</i>.</div><div><br></div><div>Could it be creating a prototype property, as other unprefixed property initialisers such as <font face="Courier">get</font> and <font face="Courier">set</font> accessor declarations, and property initialiser extensions declaring prototype methods, do? Yes, that's the intent.</div>

<div><br></div><div>But, I object (mildly), it does not <i>look</i> like a property initialiser. It looks like an assignment expression-statement.</div></div></div></div></blockquote><div><br></div><div>Agreed, completely. My first stab at this used <font class="Apple-style-span" face="'courier new', monospace">var</font> for declaring fields:</div>

<div><br></div><div><font class="Apple-style-span" face="'courier new', monospace">class Point {</font></div><div><font class="Apple-style-span" face="'courier new', monospace">  var x = 0; // x field on prototype</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">}</font></div><div><br></div><div>I know Mark wishes <font class="Apple-style-span" face="'courier new', monospace">var</font> could be banished from the language completely. My goal would be to have <font class="Apple-style-span" face="'courier new', monospace">let</font> become the thing you use for variables and <font class="Apple-style-span" face="'courier new', monospace">var</font> then becomes a "free" keyword we can then repurpose for something like this. I don't know if that would just sow confusion, but <font class="Apple-style-span" face="'courier new', monospace">var</font> seems like too nice of a keyword to go to waste, and it would be unambiguous inside a class since a class body doesn't allow arbitrary statements.</div>

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word"><div><div><div>But this is only for defining data properties on the class prototype. Is this case common?</div>

</div></div></div></blockquote><div><br></div><div>Closure code uses data-on-the-prototype pervasively for default values, like:</div><div><br></div><div><font class="Apple-style-span" face="'courier new', monospace">class Thermostat {</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">  var temp = 70; // on proto</font></div><div><font class="Apple-style-span" face="'courier new', monospace">  setTemp(temp) {</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">    this.temp = temp; // once you touch it, it becomes specific to the instance</font></div><div><font class="Apple-style-span" face="'courier new', monospace">  }</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">}</font></div><div><br></div><div>I count nine examples of this just in <a href="http://closure-library.googlecode.com/svn/docs/closure_goog_ui_control.js.source.html">Control.js</a> (search for<font class="Apple-style-span" face="arial, helvetica, sans-serif"> "<span class="Apple-style-span" style="color: rgb(77, 77, 77); line-height: 16px; white-space: pre-wrap; "><span class="pln" style="color: rgb(0, 0, 0); ">prototype</span><span class="pun" style="color: rgb(102, 102, 0); ">.</span><span class="pln" style="color: rgb(0, 0, 0); ">content_"). It has the advantage of not wasting per-instance memory for values that are still the default, which is a neat trick that class-based languages can't do.</span></span></font></div>

<meta charset="utf-8"><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word"><div><div><div>Or if you have a measured need based on some existing code, which I'd love to hear about: consider a prefixing keyword to make this look like an alternative to <font face="Courier">static x = 0</font>.</div>

</div></div></div></blockquote><div><br></div><div>That was part of my motivation for using <font class="Apple-style-span" face="'courier new', monospace">var</font>. It seemed weird to have an adjective like <font class="Apple-style-span" face="'courier new', monospace">static</font> without a noun that it modifies. (I was also using <font class="Apple-style-span" face="'courier new', monospace">function</font> for methods for the same reason, though we've moved away from that.)</div>

<div><br></div><div>- bob</div></div>