[Proto-Scripty] Re: Help needed, its got to be simple

2010-07-15 Thread T.J. Crowder
Hi,

 Why does the function quotes (within the class) fail when the exact
 same function dquote (outside the class) works fine.

The function's fine; what's happening is that you're trying to use an
undefined symbol (in `doc_name`, `quotes` is undefined). `this` is
*never* implicit in JavaScript the way it is in some other languages,
you have to write it explicitly.

You could fix it by adding this.:

doc_name: function()  { return this.quotes( this.name ); }

...but since `quotes` doesn't need access to any of the instance
properties, there's no reason to put it on the object at all. I'd
probably use a closure instead and make it just a function within the
closure:

var Test_01= (function() {

function quotes( strStr ) {
return \ + strStr + \;
}

return Class.create( {

initialize: function( strName ) {
this.name   = String( strName );
},

doc_name: function()  { return quotes( this.name ); }

});

})();

There, I've wrapped up your Class.create call inside an anonymous
function (called a scoping function) and immediately called the
function. `quotes` ends up being in scope for any code inside the
scoping function, but out of scope for any code outside of it. It
makes `quotes` similar to a private class method in class-based
systems, although the mechanism at work (closures) is rather more
powerful than that. More on closures here:
http://blog.niftysnippets.org/2008/02/closures-are-not-complicated.html

I'd also steer away from using anonymous functions other than as
scoping functions (all of the functions in your Test_01 class are
anonymous); more here:
http://blog.niftysnippets.org/2010/03/anonymouses-anonymous.html

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


On Jul 14, 4:50 pm, Zortag zor...@rcn.com wrote:
 I'm pretty new to both JavaScript and Prototype, but have been
 programming for over 30 years, and so this one is causing me to tear
 out what little hair I have left.  Basically, I can't seem to figure
 out what is wrong when I move a function that works outside of a class
 into a class, it is a very simple function, just wrap a piece of text
 in double-quotes.  But when called from within a class, the script
 blows up and dies.  I'm using Firefox, Firebug does see that the class
 has the item and that it is a function; but the script dies as if it
 could not find the function.  The JavaScript console remains empty.

 Why does the function quotes (within the class) fail when the exact
 same function dquote (outside the class) works fine.  I figure it's
 something simple but it has eluded me.

 html
   head
     script src=../prototype.js type=text/javascript/script
   /head
   body
     script type=text/javascript
       var printp = function( strStr ) { document.write( p + strStr
 + /p ); };
       var dquote = function( strStr ) { return \ + strStr +
 \; };

       printp( Begin Test! );

       printp( Test 1:  + dquote( 'test 1' ) );

       var Test_01    = Class.create( {
           initialize: function( strName ) {
               this.name           = String( strName );
           },

           quotes:         function( strStr ) { return \ + strStr +
 \; },
           doc_name:       function()  { return quotes( this.name ); }
       });

       var test_02 = new Test_01( 'test' );

       printp( Test 2: \ + test_02.name + \ );
       printp( Test 3:    + test_02.doc_name()  );

       printp( End Test! );

     /script
   /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.



[Proto-Scripty] Re: Help needed, its got to be simple

2010-07-15 Thread Zortag
Thanks, TJ.  Especially for the explanation and the pointers, that
this is not automatic clears up a lot.

On Jul 15, 5:41 am, T.J. Crowder t...@crowdersoftware.com wrote:
 Hi,

  Why does the function quotes (within the class) fail when the exact
  same function dquote (outside the class) works fine.

 The function's fine; what's happening is that you're trying to use an
 undefined symbol (in `doc_name`, `quotes` is undefined). `this` is
 *never* implicit in JavaScript the way it is in some other languages,
 you have to write it explicitly.

 You could fix it by adding this.:

     doc_name: function()  { return this.quotes( this.name ); }

 ...but since `quotes` doesn't need access to any of the instance
 properties, there's no reason to put it on the object at all. I'd
 probably use a closure instead and make it just a function within the
 closure:

 var Test_01    = (function() {

     function quotes( strStr ) {
         return \ + strStr + \;
     }

     return Class.create( {

         initialize: function( strName ) {
             this.name           = String( strName );
         },

         doc_name: function()  { return quotes( this.name ); }

     });

 })();

 There, I've wrapped up your Class.create call inside an anonymous
 function (called a scoping function) and immediately called the
 function. `quotes` ends up being in scope for any code inside the
 scoping function, but out of scope for any code outside of it. It
 makes `quotes` similar to a private class method in class-based
 systems, although the mechanism at work (closures) is rather more
 powerful than that. More on closures 
 here:http://blog.niftysnippets.org/2008/02/closures-are-not-complicated.html

 I'd also steer away from using anonymous functions other than as
 scoping functions (all of the functions in your Test_01 class are
 anonymous); more 
 here:http://blog.niftysnippets.org/2010/03/anonymouses-anonymous.html

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

 On Jul 14, 4:50 pm, Zortag zor...@rcn.com wrote:

  I'm pretty new to both JavaScript and Prototype, but have been
  programming for over 30 years, and so this one is causing me to tear
  out what little hair I have left.  Basically, I can't seem to figure
  out what is wrong when I move a function that works outside of a class
  into a class, it is a very simple function, just wrap a piece of text
  in double-quotes.  But when called from within a class, the script
  blows up and dies.  I'm using Firefox, Firebug does see that the class
  has the item and that it is a function; but the script dies as if it
  could not find the function.  The JavaScript console remains empty.

  Why does the function quotes (within the class) fail when the exact
  same function dquote (outside the class) works fine.  I figure it's
  something simple but it has eluded me.

  html
    head
      script src=../prototype.js type=text/javascript/script
    /head
    body
      script type=text/javascript
        var printp = function( strStr ) { document.write( p + strStr
  + /p ); };
        var dquote = function( strStr ) { return \ + strStr +
  \; };

        printp( Begin Test! );

        printp( Test 1:  + dquote( 'test 1' ) );

        var Test_01    = Class.create( {
            initialize: function( strName ) {
                this.name           = String( strName );
            },

            quotes:         function( strStr ) { return \ + strStr +
  \; },
            doc_name:       function()  { return quotes( this.name ); }
        });

        var test_02 = new Test_01( 'test' );

        printp( Test 2: \ + test_02.name + \ );
        printp( Test 3:    + test_02.doc_name()  );

        printp( End Test! );

      /script
    /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.