Just as a comparison point, in MontageJS we chose to implement the DOM Event Target and Event Listener interfaces on Montage JavaScript objects to avoid adding similar APIs under a different name.
Benoit > On Oct 2, 2013, at 19:18, Andrea Giammarchi <[email protected]> > wrote: > > It's a knockout choice I would say, nothing to do with the fact you cannot > have an `handleEvent` in there. > > Look at [eddy.js](https://github.com/WebReflection/eddy#event-driven-js) or > put in in your project and you could handleEvent all the things, DOM and not > ^_^ > > As easy as that, but you confirmed developers are not familiar at all with > such pattern: this is bad, IMO, bad for them as massive limit over > architectures aimed to deal with the DOM and/or even server side JS. > > That being said, I understand your very specific knockout base, but that's a > surrounding env problem that didn't give you an easy way to solve this if not > through bind or `self` addressed variable :-( > > Thanks for sharing though, libraries/frameworks are always a good example of > "already got this problem in here". > > br > > >> On Wed, Oct 2, 2013 at 2:55 PM, Marius Gundersen <[email protected]> wrote: >> Look at knockout.js and the way computed properties work. You quickly end up >> with multiple bound functions on a single object, which are always >> anonymous. The projects I've worked on lately has a lot of `var self = this` >> to get things to work. Because we use knockout.js we don't have any native >> dom event handlers, so your trick with the eventHandler method won't work. >> And we use pubsub, which affect observables on the `this` object, and Ajax >> is handled through Promises, which also needs access to the `this` object. >> >> Marius Gundersen >> >>> On Oct 2, 2013 11:35 PM, "Andrea Giammarchi" <[email protected]> >>> wrote: >>> when do you need to address at runtime so many methods per instance/object ? >>> >>> I've got the "solve inline" thing but I keep wondering when, where, and >>> why, we need so many inline runtime bound method attachments. >>> >>> Any real code example beside showing how shorter it is ? >>> >>> Promises could simply implement handleEvent too though, it will make >>> objects reusable per each promise lifecycle at any time and with hot-swap >>> per each handleMethod possibility. >>> >>> Very powerful, too bad developers behind didn't propose this approach too >>> (yes, handleEvent can be swapped at runtime, that's how you could create a >>> whole new world of possibilities through a single object and without even >>> bother the DOM through add/remove listeners) >>> >>> Thanks >>> >>> >>> >>> >>>> On Wed, Oct 2, 2013 at 2:23 PM, Marius Gundersen <[email protected]> >>>> wrote: >>>> >>>> Every time someone wants to make a framework in JS they need to consider >>>> `this`. For example, a simple pubsu library could look like this: >>>> >>>> publish("event", arg1, arg2) >>>> subscribe("event", function(arg1, arg2){ >>>> //do something, e.g. this.something = arg1+arg2 >>>> }, this); >>>> >>>> But now the callback has the wrong this. One way around this is to force >>>> people to use bind(this), or you can force developers to always support a >>>> boundContext argument for every callback. For example, in promises: >>>> >>>> doSomething().then(function(result){ >>>> this.result = result >>>> }, this); >>>> >>>> Or with Knockout: >>>> >>>> this.sum = ko.computed(function(){ >>>> return this.a() + this.b(); >>>> }, this); >>>> >>>> Or with array functions: >>>> >>>> this.array.filter(function(a){ >>>> return a>5; >>>> }).forEach(function(a){ >>>> this.sum += a; >>>> }, this); >>>> >>>> These can all be simplified using the fat arrow: >>>> >>>> subscribe((arg1, arg2) => this.something = arg1 + arg2); >>>> >>>> doSomething().then((result) => this.result = result); >>>> >>>> this.sum = ko.computed(() => this.a() + this.b()); >>>> >>>> this.array.filter((a) => a>5).forEach((a) => this.sum += a); >>>> >>>> Not only does it reduce the amount of typing, which makes it easy to fit >>>> all these examples into a single line, it takes care of the this variable, >>>> which is used in a lot more places than DOM event handlers. >>>> >>>> Marius Gundersen >>>> >>>> >>>>> On Wed, Oct 2, 2013 at 8:14 PM, Andrea Giammarchi >>>>> <[email protected]> wrote: >>>>> If you cannot use fat arrow to define prototypes than you cannot recycle >>>>> functions per each instance neither. >>>>> IIRC you are behind a pretty damn good framework that works on DOM and >>>>> indeed I was wondering if `handleEvent` would have been your choice there >>>>> too. >>>>> >>>>> Thanks for your thoughts. >>>>> >>>>> >>>>>> On Wed, Oct 2, 2013 at 11:05 AM, Benoit Marchant <[email protected]> >>>>>> wrote: >>>>>> One could say that JavaScript is an object oriented language where >>>>>> functions are first class citizen. But JavaScript doesn't have methods, >>>>>> which in most oo languages have the feature of always running with this >>>>>> being the object the methods is executed on. >>>>>> >>>>>> Was introducing a new type "method" considered? In JavaScript it would >>>>>> solve one class of problem we have with functions, which is the one I've >>>>>> been most impacted with as I generally use JS in an more oo way than >>>>>> functional way. And yes, I used more handleEvent for that reason. >>>>>> >>>>>> Benoit >>>>>> >>>>>> EOn Oct 2, 2013, at 10:55, Andrea Giammarchi >>>>>> <[email protected]> wrote: >>>>>> >>>>>>> fat arrow does not add any capabilities but create the need to be sure >>>>>>> about the context. >>>>>>> >>>>>>> In use strict fat arrow will bring a lovely `undefined` wich is >>>>>>> undesired so nothing is solved in there. >>>>>>> You need to be sure that the function/closure that is defining the fat >>>>>>> arrow is doing it in a `this` context you expect and I wonder how many >>>>>>> developers will fall into a `this` hell instead of "_callback hell_" >>>>>>> forced to define fat arrows inside functions such: >>>>>>> >>>>>>> ```javascript >>>>>>> (function(){ >>>>>>> >>>>>>> this.method = () => alert(123); >>>>>>> >>>>>>> }).call(theDesiredContext); >>>>>>> ``` >>>>>>> >>>>>>> The good part is that I've already written about so many pattern able >>>>>>> to solve many common mistakes fat arrow will introduce so at least for >>>>>>> me this will be a good reference to solve those mistakes/problems later >>>>>>> on in the future. >>>>>>> >>>>>>> Not much to add if not please read again your first answer to my >>>>>>> question, something not just me found not just rude. >>>>>>> >>>>>>> I've asked a question, a honest one, trying to understand. I wasn't >>>>>>> trolling and I write real code so your "virtually nobody use that" >>>>>>> approach is my daily basis code which is "virtually a better >>>>>>> architecture for my needs" that I strongly hope W3C won't ever decide >>>>>>> to get rid of because it avoids massive, expensive, pointless usage of >>>>>>> extra objects, GC operations, and amount of RAM. >>>>>>> >>>>>>> Google is usually very keen to these problems, handleEvent solve an >>>>>>> infinity of them at once, developers should just learn how convenient >>>>>>> this approach could be for mostly all their DOM based tasks and why >>>>>>> not, even more. >>>>>>> >>>>>>> Best Regards >>>>>>> >>>>>>> >>>>>>> >>>>>>>> On Wed, Oct 2, 2013 at 10:46 AM, Tab Atkins Jr. <[email protected]> >>>>>>>> wrote: >>>>>>>> On Tue, Oct 1, 2013 at 7:35 PM, Andrea Giammarchi >>>>>>>> <[email protected]> wrote: >>>>>>>> > setTimeout accept extra arguments ... I write JavaScript that uses >>>>>>>> > this >>>>>>>> > feature. >>>>>>>> > >>>>>>>> > `setTimeout(callback, delay, arg1, arg2, argN, evenAnObject);` >>>>>>>> > >>>>>>>> > so fat arrow does not solve much here, I can use self as first >>>>>>>> > argument and >>>>>>>> > I am good. >>>>>>>> > >>>>>>>> > `forEach` and all other arrays accept a second argument >>>>>>>> > >>>>>>>> > `array.forEach(doStuff, boundContextObject);` >>>>>>>> > >>>>>>>> > so fat arrow does not solve a thing in mostly all Array extras. >>>>>>>> >>>>>>>> Having the capability to set 'this' (or pass the current this as a >>>>>>>> plain argument) doesn't make it any more convenient. 'this' still >>>>>>>> isn't captured by the closure like every other variable is, which is >>>>>>>> confusing. As David said, being forced to pollute the signature of >>>>>>>> every standard callback-taking function with this argument is just >>>>>>>> silly. As Claude and others have said, the silly 'this'-rebinding >>>>>>>> kludges we have to adopt *everywhere* just to work around this feature >>>>>>>> of JS are ridiculous and fragile. Automatic 'this' binding is very >>>>>>>> convenient in some places. In others, it's very inconvenient. Arrow >>>>>>>> functions give us something better suited for those latter cases. >>>>>>>> >>>>>>>> > for **DOM** I use handlers as specified by **W3C** so that >>>>>>>> > `{handleEvent: >>>>>>>> > function () {this}}` works better than any mess I could create with >>>>>>>> > callbacks that I won't be unable to remove later on (as I've said) >>>>>>>> > ... >>>>>>>> >>>>>>>> Virtually nobody does this, and newer interfaces specified with the >>>>>>>> WebIDL 'callback' type don't accept it at all. >>>>>>>> >>>>>>>> > so I >>>>>>>> > can use `removeEventListener(this)` in every method handled by that >>>>>>>> > object. >>>>>>>> >>>>>>>> I didn't mention event listeners, actually. There are lots of other >>>>>>>> things that take callbacks besides event listeners. >>>>>>>> >>>>>>>> > So I actually wonder what kind of JavaScript **you** write because >>>>>>>> > this was >>>>>>>> > a honest question but probably ... people not familiar with JS are >>>>>>>> > the >>>>>>>> > answer: since developers ignore part of JS specs available since >>>>>>>> > every then >>>>>>>> > we need a fat arrow to break old syntax to make the creation of self >>>>>>>> > bound >>>>>>>> > function easier. >>>>>>>> > >>>>>>>> > This would be already an answer so thanks for participating. >>>>>>>> >>>>>>>> Wow, that's pretty rude. >>>>>>>> >>>>>>>> ~TJ >>>>>>> >>>>>> >>>>>>> _______________________________________________ >>>>>>> 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 >>>> >>>> >>>> _______________________________________________ >>>> 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
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

