Thanks, gentlemen. This is very helpful; exactly the kind of advice I was looking for.
Zörn, re: changing Object.prototype, I just did that for this example so ie wouldn't throw an error when using .toSource(). I'm investigating this because jQuery has allowed me more time to think about better code design instead of spending all my time banging away at the standard cross-browser javascript stuff. Seems to me that a nice simple page showing examples like this (once it's all cleaned up per your suggestions) would be a good thing to add to the jQuery repository for intermediate javascripters. Yet another reason jQuery rocks. Thanks for all your work on it. On 1/4/07, Felix Geisendörfer <[EMAIL PROTECTED]> wrote:
- Use your object function (jQuery.foo) only as a constructor, try to put all methods into jQuery.foo.prototype (less stuff in cunstructor -> better OO design) Obviously you can't access "self" from your methods, so you have to design everything well enough to be able to work without "self" Hmm but I wonder if it wouldn't be more pragmatic here to define all functions in the constructor because having access to self everywhere is a very nice option to have. I'm often doing this when creating JS objects, and something like this could keep the code quite readable: jQuery.foo = function(element) { var self = this; this.constructor = function() { // Access self in callbacks, eg. $(element).click(function(event) { self.handle(event); }); } this.handle = function() { alert('Hey, who clicked on me?'); } this.constructor(); } What do you think? (constructor might not work as a function name due to a keyword conflict in JS, but you get the idea) Personally I prefer wrapping all of my class code inside a function over using prototype to extend it. -- Felix -------------------------- http://www.thinkingphp.org http://www.fg-webdesign.de Jörn Zaefferer wrote: Briz schrieb: I'm mostly interested in how to cleanly and reliably deal with scope issues in callbacks. I haven't read every detail of your example. Some suggestions: - Do not extend Object.prototype. That can give you quite a lot of trouble - Try to gather all necessary callbacks inside the plugin method (jQuery.fn.foo) or the constructor (jQuery.foo) and delegate to methods of your object inside the callbacks, while keeping the anonymous functions for the callbacks as small as possible - Avoid using each() in your code, and use a small plugin instead, heavily reduces the need for anonymous functions inside your object's code - Use your object function (jQuery.foo) only as a constructor, try to put all methods into jQuery.foo.prototype (less stuff in cunstructor -> better OO design) A bit additional explanation. The code structure would look like this: jQuery.foo = function(element) { // constructor code here var self = this; // access self in callbacks, eg. $(element).click(function(event) { self.handle(event); }); } jQuery.foo.prototype = { // methods here, like handle() } Obviously you can't access "self" from your methods, so you have to design everything well enough to be able to work without "self". Hope that helps. _______________________________________________ jQuery mailing list discuss@jquery.com http://jquery.com/discuss/
-- _____________________________________ Brad Brizendine CTO, Glyphix http://www.glyphix.com/
_______________________________________________ jQuery mailing list discuss@jquery.com http://jquery.com/discuss/