Sorry in advance if this is confusing... I am new to jQuery (converting myself from Prototype), and as such I am finding situations where I need to create a new object, which I would have done with a class in Prototype (as such, doesn't make sense for it to appear anywhere except the start of a chain, since it will return a new object). This object will also be used similar to a superclass for other objects as well. I also want the object to be chain-able as well.
My first attempt at this was something along these lines: (function($) { function create($opts) { // some code to create an object return obj; } $.fn.firstObj = function($opts) { // Error any chained calls if (this.length) throw SyntaxError(); return create($.extend({}, arguments.callee, $opts)); } $.extend( $.fn.firstObj, { // Some public methods and default properties prop1: 'val1', prop2, 'val2', method1: function() { dosomething(arguments); } } ); })(jQuery); (function($) { function create($opts) { // some code to create an object return obj; } $.fn.secondObj = function($opts) { // Error any chained calls if (this.length) throw SyntaxError(); return $.fn.firstObj($.extend({}, arguments.callee, $opts)); } $.extend( $.fn.secondObj, { // Some public methods and default properties prop1: 'newval1', //overrides $.fn.firstObj.prop1 newprop2, 'val2', newmethod1: function() { dosomethingelse(arguments); } } ); })(jQuery); Problem is, that say I chain either of the returned objects, I lose the public methods for those objects. example: var newObj = $.fn.firstObj({prop1: 'foobar'}); console.log(newObj.method1 + ''); // logs: function() {dosomething(arguments);} newObj.click( function() { console.log(this.method1 + ''); } ); // logs undefined now (I've also tried $(this).method1) What is the proper way of creating a new object in jQuery so that it can properly be chained afterwards?