Es stellt sich heraus, dass jQuery 1.5 eine neue Methode namens sub hat :)
Der Dokumentation zufolge sind sub
erstellt eine neue Kopie von jQuery, deren Eigenschaften und Methoden geändert werden können, ohne das ursprüngliche jQuery-Objekt. http://api.jquery.com/jQuery.sub/
Diese Methode erlaubte es nicht, eine Unterklasse zu unterteilen, aber ich fand eine geänderte Methode in ihrem Ticket Tracker, die dies erlaubte:
jQuery.subclass = function(){
function jQuerySubclass( selector, context ) {
return new jQuerySubclass.fn.init( selector, context );
}
jQuery.extend(true, jQuerySubclass, this);
jQuerySubclass.superclass = this;
jQuerySubclass.fn = jQuerySubclass.prototype = this();
jQuerySubclass.fn.constructor = jQuerySubclass;
jQuerySubclass.fn.init = function init( selector, context ) {
if (context && context instanceof jQuery && !(context instanceof jQuerySubclass)){
context = jQuerySubclass(context);
}
return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
};
jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
var rootjQuerySubclass = jQuerySubclass(document);
return jQuerySubclass;
};
Damit können Sie etwa so vorgehen:
var Calendar = jQuery.subclass();
Calendar.create = function() {
var cal = Calendar( /* some html code for building the calendar */ );
// Do some processing like binding events, etc
return cal;
}
Calendar.fn.val = function(value) {
//Calendar's implementation of val
}
Das Calendar-Objekt verhält sich genau wie ein jQuery-Objekt außer für die oben genannten Unterschiede. Es wird auch korrekt eine Instanz von Calendar zurückgeben, wenn ich Methoden miteinander verkette. Das ist toll, weil
- Wir können leicht benutzerdefinierte Widgets erstellen erstellen, ohne den jQuery Namespace.
- Wir können unsere eigenen Implementierungen von jQuery-Methoden bereitstellen
- Wir können die Leistungsfähigkeit von jQuery mit Methoden wie trigger und bind nutzen, die bereits Teil der Klasse sind
Als nächstes bin ich daran interessiert, dass Klassen per Selektor registriert werden können. Auf diese Weise, wenn Sie $('.MyAwesomeCalendar') aufrufen, erhalten Sie ein Kalender-Objekt zurück, ohne explizit Calendar('.MyAwesomeCalendar') aufrufen zu müssen.