Oops, sorry for the weird formatting... On Mon, Aug 3, 2009 at 6:38 PM, Ryan Gahl <ryan.g...@gmail.com> wrote:
> Let me suggest the module pattern - which not inconsequently also enables > true private fields and methods (just because it seems you're looking for > alternative patterns). Also, since the module pattern allows for true > private members, you can just create a helper function at the module level, > thus avoiding placing the "f" function at the instance level. This assumes > you probably don't want calling code to create and instance of Sub2 and then > just randomly make calls to myInstance.f()... > > // (if you don't use a globally accessible namespace object to tack your >> classes onto, then declare the class variable outside of the module function >> so the reference is visible elsewhere, but I highly recommend just using a >> namespace object to hold all your classes instead) > > > var Sub2; //as in the note above, only required here if not using a > namespace object > > (function() { > > > //put the handler here, as a helper function, and no need for it to be > public because you typically won't want outside code to do someInstance.f(), > right? (no more of this "it has an underscore so it's private" stuff, people > :) > > > function f() { > > alert("Class:" + this.fu + this.baz); > > } > > > Sub2 = Class.create(Super2, { // notice no "var" since in this > example we declared outside the module so it's available outside the module > > baz: "bat", > > initialize: function () { > > document.observe("click", f.bind(this)); //just in-line the > binding to make it cleaner, unless you need to re-user the bound function, > then maybe cache it in a variable > > } > > }); > > })(); > > > new Sub2(); > > > > > > > On Mon, Aug 3, 2009 at 12:05 PM, T.J. Crowder <t...@crowdersoftware.com> > wrote: > >> >> Hi, >> >> > But it's really inelegant. How am I supposed to handle this? >> >> Pretty much like that, except I haven't reassigned the property like >> that. It *should* be fine, you'll create an own property 'f' on the >> instance (rather than an inherited one from the prototype) that's >> bound. But it bothers me and I can't give you a good reason for >> it. :-) I've done that sort of thing before (keep a bound copy around >> on the instance, if I'm going to reuse it), I've just for some reason >> always used a different prop name, I guess so I'm not in doubt whether >> I've bound it. But doing it in the initializer like you have, there >> wouldn't be any confusion... >> >> Also, the odds are pretty high you just want #bind, not >> #bindAsEventListener.[1] >> >> [1] >> http://proto-scripty.wikidot.com/prototype:tip-you-probably-don-t-need-bindaseventlistener >> >> HTH, >> -- >> T.J. Crowder >> tj / crowder software / com >> Independent Software Engineer, consulting services available >> >> >> On Aug 3, 2:39 pm, Cédric <bertolini.ced...@gmail.com> wrote: >> > Hello, >> > >> > I'm trying to use the Class methods to manage my object hierarchy on >> > my current project, but I have some trouble with the "this" keyword in >> > conjonction with Class.create. >> > >> > Here is a piece of plain-js code using prototypes to get inheritance: >> > >> > var Super1 = function () { >> > this.fu = "bar"; >> > >> > } >> > >> > var Sub1 = function () { >> > this.baz = "bat"; >> > this.f = function () { >> > alert("classic:"+this.fu+this.baz); >> > }.bind(this); >> > document.observe("click", this.f);}; >> > >> > Sub1.prototype = new Super1(); >> > new Sub1(); >> > >> > Here is my attempt at mimic this with Class.create: >> > >> > var Super2 = Class.create({ >> > fu: "bar" >> > >> > }); >> > >> > var Sub2 = Class.create(Super2, { >> > baz: "bat", >> > f: function () { >> > alert("Class:"+this.fu+this.baz); >> > }.bindAsEventListener(this), >> > initialize: function () { >> > document.observe("click", this.f); >> > }}); >> > >> > new Sub2(); >> > >> > But of course it doesn't work, f in bound to window, not the object >> > create by new. The only way I found is: >> > >> > var Super2 = Class.create({ >> > fu: "bar" >> > >> > }); >> > >> > var Sub2 = Class.create(Super2, { >> > baz: "bat", >> > f: function () { >> > alert("Class:"+this.fu+this.baz); >> > }, >> > initialize: function () { >> > this.f = this.f.bindAsEventListener(this); >> > document.observe("click", this.f); >> > }}); >> > >> > new Sub2(); >> > >> > But it's really inelegant. How am I supposed to handle this? >> >> >> --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Prototype & script.aculo.us" group. To post to this group, send email to prototype-scriptaculous@googlegroups.com To unsubscribe from this group, send email to prototype-scriptaculous+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/prototype-scriptaculous?hl=en -~----------~----~----~----~------~----~------~--~---