Hi,

If you really want `takeAction` to be a public property on the
instance, you typically use Function#bind for this; example in the
docs:
http://api.prototypejs.org/language/function/prototype/bind/

Basically, Function#bind creates a function that, when called, will
turn around and call the original function in a way that `this` is set
correctly, passing along any arguments. The function is defined is in
a small context so it's not closing over a bunch of extraneous stuff.

Alternately, if you're setting up a number of event handlers that
*don't* actually need to be instance methods, they just need access to
`this`, AND the code within them is small, you can use your
initializer closure to do that more directly:

    var Thingy = Class.create({
        initialize: function() {
            var self = this;

            $('foo').observe('click', fooClick);
            $('bar').observe('click', barClick);

            function fooClick(event) {
                self.doSomething();
            }

            function barClick(event) {
                self.doSomething();
                self.doSomethingElse();
            }
        },
        doSomething: function() {
            alert("I did something.");
        },
        doSomethingElse: function() {
            alert("I did something else.");
        }
    });

That avoids creating multiple small closures (one for each event
handler), but note that a new copy of each of those functions is
created for each instance, so if they're more than a line or two of
code, #bind is the way to go. More on closures here:
http://blog.niftysnippets.org/2008/02/closures-are-not-complicated.html

Off-topic, but:

* Your use of Class.create is a couple of years behind Prototype. As
of 1.6, the correct use is to pass the object containing the method
definitions *into* Class.create, not to replace the prototype
afterward. Example above.
* Rather than using addEventListener directly (which will fail on IE7
(8?) and below), use Prototype's observe method instead:
http://api.prototypejs.org/dom/event/observe/

HTH,
--
T.J. Crowder
Independent Software Consultant
tj / crowder software / com
www.crowdersoftware.com


On Jul 20, 6:13 pm, Doc Torbin <mtor...@gmail.com> wrote:
> I have the following snippet of code which illustrates a problem that
> I'm having.  I have an event listener within a class that I'd like to
> have be "self aware".  I'd like it to be able to call another function
> within the Class but I haven't found the right method to have it do
> so.  Please advise:
>
> <!DOCTYPE html>
> <html>
>         <head>
>                 <script type="text/javascript" src="../prototype.js"></script>
>                 <style type="text/css">
>                         #box{position:fixed;width:100px;border:3px solid 
> #000;background-
> color:#00ff00;font-size:14pt;font-weight:bold;text-
> align:center;padding:50px 25px;cursor:pointer;}
>                 </style>
>                 <script type="text/javascript">
>                         var MyOBJ = new Class.create();
>                         MyOBJ.prototype = {
>                                 initialize: function(){
>                                         try{
>                                                 
> $('box').addEventListener("click",this.takeAction,false);
>                                         }
>                                         catch(error){alert(error);}
>                                 },
>                                 takeAction: function(event){
>                                         alert("I got to this function without 
> issue.");
>                                         this.anotherAction();
>                                 },
>                                 anotherAction: function(){
>                                         alert("I won't get here.");
>                                 }
>                         }
>
>                         document.observe("dom:loaded", function(){
>                                 var spriteOBJ = new MyOBJ();
>                         });
>                 </script>
>         </head>
>         <body>
>                 <div id="box">BOX</div>
>         </body>
> </html>

-- 
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-scriptacul...@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.

Reply via email to