On Tue, Jun 7, 2011 at 3:15 PM, Kam Kasravi <span dir="ltr"><<a href="mailto:kamkasravi@yahoo.com" target="_blank">kamkasravi@yahoo.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">

<br>
In the harmony:classes proposal the following example is provided:<br>
<br>
class Monster {<br>
  // "static" places the property on the constructor.<br>
  static allMonsters = [];<br>
<br>
  // "public" declares on the prototype.<br>
  public numAttacks = 0;<br>
<br>
  // "private" places it on the private record of the new instance.<br>
  private health;<br>
}<br>
<br>
According to the grammar it doesn't appear that static and private are allowed together. That is<br>
  static private allMonsters = [];<br>
would be an error. However I think this is a common use case, for example Monster may wish to<br>
implement a constructor based dependency injection pattern as:<br>
<br>
class Monster {<br>
  constructor(name, health) {<br>
    public name = name;<br>
    private health = health;<br>
    Monster.allMonsters.push(this);<br>
  }<br>
  static allMonsters = [];<br>
}<br>
<br>
class YourMammaMonster extends Monster {<br>
  constructor(name,posse) {<br>
    super(name, 10);<br>
    private posse = posse;<br>
  }<br>
  set health(value) {<br>
    private(this).health = value*0.5;<br>
  }<br>
}<br>
<br>
In this scenario, Monster would want strong encapsulation of allMonsters. Have the authors considered this use case? Are their alternative patterns to achieve a similar result?<br></blockquote><div><br></div><div>Hi Kam, good example!</div>

<div><br></div><div>In the proposal as it stands, you can achieve this by lexical capture. The following use of "module" is not essential, but it makes the lexical capture pattern a bit more straightforward:</div>

<div><br></div><div>    module {</div><div>      allModules = [];</div><div>      export class Monster {</div><div>        constructor(name, health) {</div><div>          public name = name;</div><div>          private health = health;</div>

<div>          allMonsters.push(this);</div><div>        }</div><div>      }</div><div>    }</div><div><br></div><div>We have talked about adding some way to state class-private per-class variable declarations without having to place them textually outside the class. However, a problem with "static private" is that it suggests that such things are properties. They're not. They're just lexically captured variables.</div>

<div><br></div></div><br>-- <br>    Cheers,<br>    --MarkM<br>