Ahh, good point Bergi. Thanks for brining that up. On Wed, Nov 11, 2015 at 11:55 AM, JD Isaacks <[email protected]> wrote:
> 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? > > On Wed, Nov 11, 2015 at 11:45 AM, Andrea Giammarchi < > [email protected]> wrote: > >> The way it could work is similar to the following one: >> >> ```js >> >> (function (wm){'use strict'; >> >> // just to show the possible internal slot mechanism >> Object.prototype.boundTo = function (method) { >> // since I've used this for ages now in eddy.js, just replicating >> var fn = typeof method === 'function' ? method : this[method]; >> var bound = wm.get(this); >> if (!bound) wm.set(this, bound = {fn:[], bound:[]}); >> var i = bound.fn.indexOf(fn); >> if (i < 0) bound.bound[i = bound.fn.push(fn) - 1] = fn.bind(this); >> return bound.bound[i]; >> }; >> >> }(new WeakMap)); >> >> >> // example >> var obj = {method: function () { return this; }}; >> >> // now, whenever needed >> obj.boundTo(obj.method); >> >> // will create the slot and set it up with obj.method >> // so that the following is true >> obj.boundTo(obj.method) === obj.boundTo('method') && >> obj.boundTo('method')() === obj; >> >> // if it's about another method >> // the equivalent of this >> ::obj.anotherMethod >> >> // whould be >> obj.boundTo(anotherMethod); >> >> ``` >> >> 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 >> >> Regards >> >> >> >> >> On Wed, Nov 11, 2015 at 4:23 PM, JD Isaacks <[email protected]> wrote: >> >>> Yes your point of view is more clear now, I like this is a lot. >>> >>> 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. >>> >>> 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. >>> >>> An example: >>> >>> ``` >>> let foo = function(){}; >>> let bar = {}; >>> >>> bar::foo // foo.bind(bar); >>> ``` >>> >>> verses >>> >>> ``` >>> let bar = { foo(){} }; >>> >>> ::foo.bar // foo.bar.bind(foo); >>> ``` >>> >>> I think both cases theoretically would be awesome to work as you >>> described. Just fuzzy on how it would look underneath. >>> >>> On Wed, Nov 11, 2015 at 11:14 AM, Andrea Giammarchi < >>> [email protected]> wrote: >>> >>>> Yeah, I've got that, my point is that whenever you need it you just >>>> `obj::method` >>>> >>>> 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. >>>> >>>> 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. >>>> >>>> Having a shortcut that all it does is replace something already short >>>> to write like a `.bind` feels to me like a missed opportunity. >>>> >>>> Moreover, with this improvement you won't need/care to have self-bound >>>> methods at all >>>> >>>> ```js >>>> let obj = { method(){} }; >>>> >>>> // and whenever needed you use >>>> obj::method; >>>> ``` >>>> >>>> Hope my POV is more clear now. >>>> >>>> Regards >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> On Wed, Nov 11, 2015 at 4:01 PM, JD Isaacks <[email protected]> wrote: >>>> >>>>> I think what you are suggesting already exists with `::obj.method` >>>>> which evaluates to `obj.method.bind(obj)` >>>>> >>>>> However, this creates a new function each time so `::obj.method >>>>> !== ::obj.method`, not sure how `::obj.method === ::obj.method` would >>>>> work. >>>>> >>>>> 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. >>>>> >>>>> You would have to do something like: >>>>> >>>>> ``` >>>>> let obj = {}; >>>>> obj.method = function(){}.bind(obj); >>>>> ``` >>>>> >>>>> With my proposal you can. >>>>> >>>>> ``` >>>>> let obj = { ::method(){} }; >>>>> ``` >>>>> >>>>> >>>>> >>>>> >>>>> On Wed, Nov 11, 2015 at 10:20 AM, Andrea Giammarchi < >>>>> [email protected]> wrote: >>>>> >>>>>> 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) >>>>>> >>>>>> That would make it lazy, usable for events (in order to be able to >>>>>> also remove them) and easily transpilable for smoother migration. >>>>>> >>>>>> Having `class A { ::method() {} }` feels like somebody is playing too >>>>>> much with the protoype or "accidentally" polluting the constructor >>>>>> >>>>>> Regards >>>>>> >>>>>> >>>>>> On Wed, Nov 11, 2015 at 2:50 PM, JD Isaacks <[email protected]> wrote: >>>>>> >>>>>>> Andrea, Sort of. I am talking about adding an additional place where >>>>>>> that operator `::` can be used -- with concise methods. >>>>>>> >>>>>>> Currently they cannot be used in the way I described above but I >>>>>>> think there are several reasons why it makes sense. >>>>>>> >>>>>>> _______________________________________________ >>>>>>> es-discuss mailing list >>>>>>> [email protected] >>>>>>> https://mail.mozilla.org/listinfo/es-discuss >>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> >
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

