Nate - There have been a couple attempts at namespacing.
I did one: http://dev.jquery.com/~john/plugins/space/ and so did Ariel: http://flesler.blogspot.com/2008/04/jquerymodularize.html They're two different techniques but both seem to work 'ok'. --John On Thu, Nov 13, 2008 at 2:34 PM, Nate Cavanaugh <[EMAIL PROTECTED]> wrote: > Ah, okay, so I guess it is what it is as far as subclassing it then. > Do you know if there are any plans to allow namespacing of plugins, or some > other way to keep a set of functionality from bleeding out into the global > scope? > Thanks for all your help John, > Nate Cavanaugh > Director of User Interface Engineering > Liferay, Inc. > Enterprise. Open Source. For life. > > > > > On Nov 12, 2008, at 1:20 PM, John Resig wrote: > > Well, the issue is that jQuery references itself internally - > including within the init function. Thus calls to jQuery.foo() or > jQuery() go back to the original jQuery method, rather than your > subclass. I don't think there's really any way around that (short of > re-writing every function in jQuery that you don't want to have access > the old jQuery name/constructor). > > --John > > > > On Wed, Nov 12, 2008 at 3:46 PM, Nate Cavanaugh <[EMAIL PROTECTED]> wrote: > > Thanks John, > > It's sooo close. > > But it doesn't read the selectors of the query (because of the return > > jQuery.fn.init.call(this)) so this in the plugins always refers to the > > document. > > If you try to do an apply(this, arguments) or even manually pass in the > > arguments to .call() it doesn't work (it won't even attach anything to > > subClass.fn). > > Any insight you can give is GREATLY appreciated :) > > Nate Cavanaugh > > Director of User Interface Engineering > > Liferay, Inc. > > Enterprise. Open Source. For life. > > > > > On Nov 12, 2008, at 11:51 AM, John Resig wrote: > > Fixed it: > > http://dev.jquery.com/~john/plugins/subclass/ > > The issue was that in: > > subClass.fn.init.prototype = subClass.prototype; > > subClass.fn.init was just a reference to jQuery.fn.init - thus when > > you modified its prototype property you were modifying the original > > jQuery init prototype property - breaking future uses. Thus you just > > have to do a quick little wrapper function around the original init, > > like so: > > var subClass = function(selector, context){ > > return new subClass.fn.init(selector, context); > > }; > > subClass.fn = subClass.prototype = jQuery(); > > subClass.fn.init = function(){ > > return jQuery.fn.init.call(this); > > }; > > subClass.fn.init.prototype = subClass.prototype; > > Which could be made into a reusable function: > > function subjQuery(){ > > var subClass = function(selector, context){ > > return new subClass.fn.init(selector, context); > > }; > > subClass.fn = subClass.prototype = jQuery(); > > subClass.fn.init = function(){ > > return jQuery.fn.init.call(this); > > }; > > subClass.fn.init.prototype = subClass.prototype; > > return subClass; > > } > > var myNewjQuery = subjQuery(); > > --John > > > > On Wed, Nov 12, 2008 at 2:29 PM, Nate Cavanaugh <[EMAIL PROTECTED]> wrote: > > Thanks John :) > > I think this has solidified the issue I was seeing, and it might not be an > > issue at all, but it's insanely weird... > > var subClass = function(selector, context){ > > return new subClass.fn.init(selector, context); > > }; > > subClass.fn = subClass.prototype = new jQuery.fn.init(); > > subClass.fn.init.prototype = subClass.prototype; > > jQuery.fn.t2 = function(){ > > console.log('jQuery plugin', this, arguments); > > }; > > subClass.fn.t2 = function(){ > > console.log('subClass plugin', this, arguments); > > }; > > subClass('body').t2(1,2); //Should print out 'subClass plugin, [body], > > [1,2]' > > jQuery('body').t2(3,4); // Should print out 'jQuery plugin, [body], [3,4]', > > but prints subClass plugin, [body], [3,4] > > console.log(jQuery.fn.t2, jQuery.fn.t2 === subClass.fn.t2); // returns > > false, as expected > > It is driving me nuts, I can't make heads or tails of whats happening... > > Nate Cavanaugh > > Director of User Interface Engineering > > Liferay, Inc. > > Enterprise. Open Source. For life. > > > > > On Nov 12, 2008, at 11:17 AM, John Resig wrote: > > Tweaked your example to make that work - it now works for both queries > > and adding methods: > > http://dev.jquery.com/~john/plugins/subclass/ > > You did: > > subClass.fn.init= subClass.prototype; > > Which should've been: > > subClass.fn.init.prototype = subClass.prototype; > > --John > > > > On Wed, Nov 12, 2008 at 2:08 PM, Nate Cavanaugh <[EMAIL PROTECTED]> wrote: > > Heya John, > > Thanks for the response, and sorry I wasn't more clear. I've tried so many > > different variations of this, that I can't remember which did what. > > That one does keep the chain properly in place, but this doesn't work: > > subClass('body') // Should error out and say subClass.fn.init is not a > > constructor. > > Every way I was able to get the above to work, it would only do so by > > maintaining the link between subClass.fn and jQuery.fn. > > Is there any other way you can think of that would essentially (and in a way > > that's performant) extend a new object off the jQuery object? > > Thanks again for your guys time :) > > Nate Cavanaugh > > Director of User Interface Engineering > > Liferay, Inc. > > Enterprise. Open Source. For life. > > > > > On Nov 12, 2008, at 6:37 AM, John Resig wrote: > > Try as I might I can't reproduce your problem. I created a test page: > > http://dev.jquery.com/~john/plugins/subclass/ > > I overwrote the removeClass method and they're both different on each > > object (subClass vs. jQuery). > > Maybe there's another mistake at play? > > --John > > > > On Tue, Nov 11, 2008 at 6:37 PM, Nate Cavanaugh <[EMAIL PROTECTED]> wrote: > > Hi all, > > As promised, here is the second topic I wanted to ask about: > > Are there any plans, or is there any current way to subclass the jQuery > > object? I've been doing a lot of digging around and I've seen some talks > > about it, and there have been some questions about what the use would be, > > but I've found a use case, and me, Paul, and Eduardo have all tried to > > figure out a way, but to no avail. > > Here is the use case: > > I want to create a function that behaves exactly like jQuery, except that it > > does some slightly different things, and be able to extend it without > > worrying about what the parent jQuery object is doing, or what plugins have > > been loaded globally. > > The benefits are that it would use the prototype chain, so it would be > > memory efficient, and it would be a way to add plugins without them being > > clobbered by other plugins. > > So, I've tried a bunch of stuff: > > var subClass = function(sel, context){ > > return new subClass.fn.init(sel, context); > > } > > subClass.fn = subClass.prototype = new jQuery.fn.init; > > subClass.fn.init = subClass.prototype; > > and I've tried so many different variations of this, but anytime I try to > > do: > > subClass.fn.test = function(){} > > it, without fail, creates jQuery.fn.test. > > To show what I am trying to do, I'll give an example: > > jQuery.fn.plugin1 = function(){ > > console.log('I am global, everyone can see me'); > > return this; > > } // globally available plugin > > subClass.fn.plugin1 = function(){ > > console.log('I am local, and I am only run when using the subclass'); > > return this; > > } // my own local plugin > > so you could do: > > jQuery('body').plugin1(); // prints 'I am global, everyone can see me' > > subClass('body').plugin1(); // prints 'I am local, and I am only run when > > using the subclass' > > However, namespaced plugins is only one advantage. Being able to attach > > custom static methods, etc, would be incredibly useful. > > Does anyone know of a way to subclass the jQuery object using it's > > prototype? > > Thanks again for reading all of this. I truly appreciate it, > > Nate Cavanaugh > > Director of User Interface Engineering > > Liferay, Inc. > > Enterprise. Open Source. For life. > > > > > > > > Nate Cavanaugh > > Director of User Interface Engineering > > Liferay, Inc. > > Enterprise. Open Source. For life. > > > > > > > > > > > > > > > Nate Cavanaugh > > Director of User Interface Engineering > > Liferay, Inc. > > Enterprise. Open Source. For life. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Nate Cavanaugh > Director of User Interface Engineering > Liferay, Inc. > Enterprise. Open Source. For life. > > > > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "jQuery Development" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/jquery-dev?hl=en -~----------~----~----~----~------~----~------~--~---
