<div dir="ltr">How about binding `this` to a variable in the constructor? The following syntax throws an error due to `this` being a reserved word, so won't break any existing code:<div><br></div><div>```</div><div>class Foo {</div><div>  constructor (this: self, /* normal args */) {</div><div>    // ...</div><div>  }</div><div>}</div><div>```</div><div><br></div><div>I can see arguments against that as it breaks the convention for how parameter lists work, and also requires a constructor. Perhaps, then, we could either use something like a modified version of class field declarations to make class variables:</div><div><br></div><div>```</div><div>class Foo {</div><div>  const self = this;</div><div>  // ...</div><div>}</div><div>```</div><div><br></div><div>Or, maybe, allow parentheses before the class body to define variables:</div><div><br></div><div>```</div><div>class Foo (this: self) {</div><div>  //...</div><div>}</div><div>```</div><div><br></div><div>No, I don't like that one either. </div><div><br></div><div>The second suggestion (class variables as extension of class fields proposal) seems like it has potential to me, so it seems like an excellent time for everyone here to tell me why it's awful and stupid.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, 10 Mar 2019 at 06:59 Jordan Harband <<a href="mailto:ljharb@gmail.com">ljharb@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr">The engine only has that knowledge when you call it in `a.b()` form - at which point, `this` is already the instance. For a keyword to not be context dependent, it'd have to be the instance even when you'd done something like `const { b } = a; b()`. To do this would require either a) `a` has its own distinct copy of `b` that's bound to `a`, or b) `a.b` to be a getter that does that binding upon request.</div><div dir="ltr"><br></div><div>Constructor-binding, field-binding, or arrow function fields all work the same way - they create a separate copy of a function for *each and every* instance, so that the function can point back to the instance even when extracted off of the object.</div><div><br></div><div>I'm not clear on how there'd be any other way to do it.</div></div><div dir="ltr"><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Mar 9, 2019 at 1:41 PM john larson <<a href="mailto:johnlarsondev1@gmail.com" target="_blank">johnlarsondev1@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr">Although the method lives on the prototype, the engine should already have knowledge of the object whose method is being invoked. I am not an expert on the internal workings of the engine, so I would be glad if anyone would correct me on this if I am wrong.</div><div id="m_6849901573705770350gmail-m_-8660865756228832385DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2"><br>
<table style="border-top-width:1px;border-top-style:solid;border-top-color:rgb(211,212,222)">
        <tbody><tr>
        <td style="width:55px;padding-top:13px"><a href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail&utm_term=icon" target="_blank"><img src="https://ipmcdn.avast.com/images/icons/icon-envelope-tick-round-orange-animated-no-repeat-v1.gif" alt="" width="46" height="29" style="width:46px;height:29px"></a></td>
                <td style="width:470px;padding-top:12px;color:rgb(65,66,78);font-size:13px;font-family:Arial,Helvetica,sans-serif;line-height:18px">Virus-free. <a href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail&utm_term=link" style="color:rgb(68,83,234)" target="_blank">www.avast.com</a>
                </td>
        </tr>
</tbody></table><a href="#m_6849901573705770350_m_-8660865756228832385_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2" width="1" height="1"></a></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Mar 10, 2019 at 12:27 AM Jordan Harband <<a href="mailto:ljharb@gmail.com" target="_blank">ljharb@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">An additional keyword like this would require a function to have a hidden reference back to the instance. However, especially for `class` methods, but also for ES5-style inheritance, or even for `class Foo {} Foo.prototype.bar = function () {}`, methods are *shared*. You might have a billion instances, but only one function that uses your new keyword - how would the engine know which instance you were referring to?</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Mar 9, 2019 at 7:50 AM Bergi <<a href="mailto:a.d.bergi@web.de" target="_blank">a.d.bergi@web.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Hi John,<br>
<br>
> I believe that it would be a trivial task for<br>
> current static code analyzers to restrict usage of "this" for anyone<br>
> opting in to use this new keyword exclusively.<br>
<br>
Static tooling, like the TypeScript compiler, can detect problematic<br>
method usage already today. Sure, having a dedicated syntax for this<br>
will make static analysis simpler, but I don't deem that a worthy<br>
addition to the language.<br>
<br>
> As you mentioned, arrow functions might have their own<br>
> problems. Wouldn't such an alternative keyword be a good addition to our<br>
> toolkit anyway?<br>
<br>
What I was trying to say is that your proposed alternative has exactly<br>
the same problems as instance-member arrow functions have today.<br>
<br>
Best regards,<br>
  Bergi<br>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div></div>
</blockquote></div>
</blockquote></div></div>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div>