<div dir="ltr">Ahh, good point Bergi. Thanks for brining that up.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 11, 2015 at 11:55 AM, JD Isaacks <span dir="ltr"><<a href="mailto:jd@jisaacks.com" target="_blank">jd@jisaacks.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I like this very much. I would prefer this to my recommendation. So how to we go about proposing it as a change to an existing proposal?</div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 11, 2015 at 11:45 AM, Andrea Giammarchi <span dir="ltr"><<a href="mailto:andrea.giammarchi@gmail.com" target="_blank">andrea.giammarchi@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>The way it could work is similar to the following one:</div><div><br></div><div>```js</div><div><br></div><div>(function (wm){'use strict';</div><div><br></div><div>  // just to show the possible internal slot mechanism</div><div><div>  Object.prototype.boundTo = function (method) {</div><div>    // since I've used this for ages now in eddy.js, just replicating</div><div>    var fn = typeof method === 'function' ? method : this[method];</div><div>    var bound = wm.get(this);</div><div>    if (!bound) wm.set(this, bound = {fn:[], bound:[]});</div><div>    var i = bound.fn.indexOf(fn);</div><div>    if (i < 0) bound.bound[i = bound.fn.push(fn) - 1] = fn.bind(this);</div><div>    return bound.bound[i];</div><div>  };</div></div><div><br></div><div>}(new WeakMap));</div><div><br></div><div><br></div><div>// example</div><div>var obj = {method: function () { return this; }};<br></div><div><br></div><div>// now, whenever needed</div><div>obj.boundTo(obj.method);<br></div><div><br></div><div>// will create the slot and set it up with obj.method</div><div>// so that the following is true</div><div><span style="color:rgb(48,57,66);font-family:'dejavu sans mono',monospace;font-size:11px;white-space:pre-wrap">obj.boundTo(obj.method) === obj.boundTo('method') &&</span></div><div><span style="color:rgb(48,57,66);font-family:'dejavu sans mono',monospace;font-size:11px;white-space:pre-wrap">obj.boundTo('method')() === obj;</span><br></div><div><br></div><div>// if it's about another method</div><div>// the equivalent of this</div><div>::obj.anotherMethod</div><div><br></div><div>// whould be</div><div>obj.boundTo(anotherMethod);</div><div><br></div><div>```<br><div><br></div><div>The string fallback is not needed or relevant, it's just a semantic shortcut in my example to reach the method through the object without repeating the object name</div><div><br></div><div>Regards</div><div><br></div><div><br></div><div><br></div></div></div><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 11, 2015 at 4:23 PM, JD Isaacks <span dir="ltr"><<a href="mailto:jd@jisaacks.com" target="_blank">jd@jisaacks.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Yes your point of view is more clear now, I like this is a lot.<div><br></div><div>But I do not know how that would be transpiled or what the desugared version would look like. However, that would be awesome as you described.</div><div><br></div><div>A thing to note. You keep using `obj::method` which is different from `::object.method` the former is when method is not already attached to the object, the later is for then it is.</div><div><br></div><div>An example:</div><div><br></div><div>```</div><div>let foo = function(){};</div><div>let bar = {};</div><div><br></div><div>bar::foo // foo.bind(bar);</div><div>```</div><div><br></div><div>verses</div><div><br></div><div><div>```</div><div>let bar = { foo(){} };</div><div><br></div><div>::foo.bar // foo.bar.bind(foo);</div><div>```</div></div><div><br></div><div>I think both cases theoretically would be awesome to work as you described. Just fuzzy on how it would look underneath.</div></div><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 11, 2015 at 11:14 AM, Andrea Giammarchi <span dir="ltr"><<a href="mailto:andrea.giammarchi@gmail.com" target="_blank">andrea.giammarchi@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Yeah, I've got that, my point is that whenever you need it you just `obj::method`<div><br></div><div>Your example indeed says that currently the proposal is that `obj::method` is similar to `obj.method.bind(obj)` which is indeed always different and indeed you want something that makes method always the same/unique bound one, which I believe is universally the preferred way.</div><div><br></div><div>What are two different bound of the same method useful for? Pretty much nothing, IMHO, while having a shortcut to lazily obtain a single bound version of that method for that object can be useful in many ways, as example `obj.on('event', anotherObj::method)` where it's always possible at that point to `obj.removeListener('event', anotherObj::method)` in case its needed.</div><div><br></div><div>Having a shortcut that all it does is replace something already short to write like a `.bind` feels to me like a missed opportunity.</div><div><br></div><div>Moreover, with this improvement you won't need/care to have self-bound methods at all</div><div><br></div><div>```js</div><div><span style="font-size:12.8px">let obj = { method(){} };</span><br></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">// and whenever needed you use</span></div><div><span style="font-size:12.8px">obj::method;</span></div><div>```</div><div><br></div><div>Hope my POV is more clear now.</div><div><br></div><div>Regards</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 11, 2015 at 4:01 PM, JD Isaacks <span dir="ltr"><<a href="mailto:jd@jisaacks.com" target="_blank">jd@jisaacks.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I think what you are suggesting already exists with `::obj.method` which evaluates to `obj.method.bind(obj)` <div><br></div><div>However, this creates a new function each time so `::obj.method !== ::obj.method`, not sure how `::obj.method === ::obj.method` would work.</div><div><br></div><div>I sort of agree with you that using it that way would be preferred. However if the community wants bound methods attached to objects, there is currently no way to do that with an object literal.</div><div><br></div><div>You would have to do something like:</div><div><br></div><div>```</div><div>let obj = {};</div><div>obj.method = function(){}.bind(obj);</div><div>```</div><div><br></div><div>With my proposal you can.</div><div><br></div><div>```</div><div>let obj = { ::method(){} };</div><div>```</div><div><br></div><div><br><div><br></div></div></div><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 11, 2015 at 10:20 AM, Andrea Giammarchi <span dir="ltr"><<a href="mailto:andrea.giammarchi@gmail.com" target="_blank">andrea.giammarchi@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Just my thoughts, I wouldn't put any self-bound thing in the class and rather improve that `::` proposal so that whenever you `obj::method` it creates a uniquely bound callback so that `obj::method === obj::method` and at that point whenever you need to export, pass, or use such method you just `obj::method` or `obj::method()` or `let method = obj::method` and bring the pattern whenever it's needed instead of being slightly different per each "place" (class rather than objects)<div><br></div><div>That would make it lazy, usable for events (in order to be able to also remove them) and easily transpilable for smoother migration.</div><div><br></div><div>Having `class A { ::method() {} }` feels like somebody is playing too much with the protoype or "accidentally" polluting the constructor</div><div><br></div><div>Regards<br><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote"><span>On Wed, Nov 11, 2015 at 2:50 PM, JD Isaacks <span dir="ltr"><<a href="mailto:jd@jisaacks.com" target="_blank">jd@jisaacks.com</a>></span> wrote:<br></span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span><div dir="ltr"><div><font color="#333333" face="Georgia, Times New Roman, Times, serif"><span style="font-size:16px;line-height:22.8571px">Andrea, Sort of. I am talking about adding an additional place where that operator `::` can be used -- with concise methods.</span></font></div><div><font color="#333333" face="Georgia, Times New Roman, Times, serif"><span style="font-size:16px;line-height:22.8571px"><br></span></font></div><div><font color="#333333" face="Georgia, Times New Roman, Times, serif"><span style="font-size:16px;line-height:22.8571px">Currently they cannot be used in the way I described above but I think there are several reasons why it makes sense.</span></font></div></div>
<br></span><span>_______________________________________________<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>
<br></span></blockquote></div><br></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>