I posted a resolution to this discussion here:
http://stackoverflow.com/questions/2061501/jquery-plugin-design-pattern-common-practice-for-dealing-with-private-function

On Jan 14, 2:08 am, Matt Maxwell <leftwithoutli...@gmail.com> wrote:
> Also, more information on the call function (if you're not familiar with it)
> can be found 
> here:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Object...
>
> <https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Object...>You
> could also use the apply 
> function:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Object...
>
> <https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Object...>If
> you need any other help with that or don't understand my example, let me
> know.
>
> Thanks,
> Matt
>
> On Wed, Jan 13, 2010 at 7:04 PM, Matt Maxwell 
> <leftwithoutli...@gmail.com>wrote:
>
>
>
> > Maybe try using something like:
>
> > $.myplugin.fill.call( this, "red" );
>
> > On Wed, Jan 13, 2010 at 6:47 PM, Tim Molendijk 
> > <taw.molend...@gmail.com>wrote:
>
> >> Hey all,
>
> >> I've been developing jQuery plugins for quite some time now, and I
> >> like to think I got pretty good at it. One issue keeps nagging me
> >> though, and that is how to deal with private functions in a powerful
> >> yet elegant manner.
>
> >> My plugins generally look something like this:
>
> >> (function($) {
>
> >>  $.fn.myplugin = function(...) {
> >>    ...
> >>    // some shared functionality, for example:
> >>    this.css('background-color', 'green');
> >>    ...
> >>  };
> >>  $.fn.mypluginAnotherPublicMethod = function(...) {
> >>    ...
> >>    // some shared functionality, for example:
> >>    this.css('background-color', 'red');
> >>    ...
> >>  };
>
> >> }(jQuery);
>
> >> Now my question is: how to neatly DRY up that shared functionality? An
> >> obvious solution would be to put it in a function within the plugin's
> >> namespace:
>
> >> var fill = function($obj, color) {
> >>  $obj.css('background-color', color);
> >> };
>
> >> Although this solution is effective and nicely namespaced, I really
> >> dislike it. For one simple reason: I have to pass it the jQuery
> >> object. I.e. I have to call it like this:
> >>  fill(this, 'red');
> >> While I would like to call it like this:
> >>  this.fill('red');
>
> >> Of course we could achieve this result by simply putting 'fill' into
> >> jQuery.fn. But that feels very uncomfortable. Imagine having ten
> >> plugins developed based on this approach and each plugin putting five
> >> of those 'private' functions into the jQuery function namespace. It
> >> ends up in a big mess. We could mitigate by prefixing each of these
> >> functions with the name of the plugin they belong to, but that doesn't
> >> really make it more attractive. These functions are supposed to be
> >> private to the plugin, so we do not want to expose them to the outside
> >> world at all (at least not directly).
>
> >> So there's my question: does anyone of you have suggestions for how to
> >> get the best of both worlds. So being able to call 'private' plugin
> >> function in a way similar to this.fill('red') (or this.myplugin.fill
> >> ('red') or even this.myplugin().fill('red') etc.), while preventing
> >> jQuery function namespace pollution. And of course it should be light-
> >> weight, as these private functions might be called very frequently.
>
> >> Thanks for your ideas.
>
> >> Regards,
> >> Tim Molendijk

Reply via email to