Skip to content
Permalink
Browse files

added jQuery.subclass

  • Loading branch information...
deadlyicon authored and wycats committed Oct 10, 2010
1 parent a8fa5f2 commit d483ce0a9c8b19dafa70be93ca071673b86a65e2
Showing with 98 additions and 5 deletions.
  1. +26 −5 src/core.js
  2. +72 −0 test/unit/core.js
@@ -3,7 +3,7 @@ var jQuery = (function() {
// Define a local copy of jQuery
var jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context );
return new jQuery.fn.init( selector, context, rootjQuery );
},

// Map over jQuery in case of overwrite
@@ -78,7 +78,8 @@ var jQuery = function( selector, context ) {
class2type = {};

jQuery.fn = jQuery.prototype = {
init: function( selector, context ) {
constructor: jQuery,
init: function( selector, context, rootjQuery ) {
var match, elem, ret, doc;

// Handle $(""), $(null), or $(undefined)
@@ -112,6 +113,7 @@ jQuery.fn = jQuery.prototype = {

// HANDLE: $(html) -> $(array)
if ( match[1] ) {
context = context instanceof jQuery ? context[0] : context;
doc = (context ? context.ownerDocument || context : document);

// If a single string is passed in and it's a single tag
@@ -171,7 +173,7 @@ jQuery.fn = jQuery.prototype = {
// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)
} else {
return jQuery( context ).find( selector );
return this.constructor( context ).find( selector );
}

// HANDLE: $(function)
@@ -222,7 +224,7 @@ jQuery.fn = jQuery.prototype = {
// (returning the new matched element set)
pushStack: function( elems, name, selector ) {
// Build a new jQuery matched element set
var ret = jQuery();
var ret = this.constructor();

if ( jQuery.isArray( elems ) ) {
push.apply( ret, elems );
@@ -287,7 +289,7 @@ jQuery.fn = jQuery.prototype = {
},

end: function() {
return this.prevObject || jQuery(null);
return this.prevObject || this.constructor(null);
},

// For internal use only.
@@ -960,6 +962,25 @@ jQuery.extend({
return { browser: match[1] || "", version: match[2] || "0" };
},

subclass: function(){
function jQuerySubclass( selector, context ) {
return new jQuerySubclass.fn.init( selector, context );
}
jQuerySubclass.superclass = this;
jQuerySubclass.fn = jQuerySubclass.prototype = this();
jQuerySubclass.fn.constructor = jQuerySubclass;
jQuerySubclass.subclass = this.subclass;
jQuerySubclass.fn.init = function init( selector, context ) {

This comment has been minimized.

Copy link
@davidmurdoch

davidmurdoch Feb 28, 2011

Contributor

Whats with the function init? It probably shouldn't be there (http://kangax.github.com/nfe/#jscript-bugs).

This comment has been minimized.

Copy link
@deadlyicon

deadlyicon Feb 28, 2011

Author Contributor

why not?

This comment has been minimized.

Copy link
@deadlyicon

deadlyicon Mar 1, 2011

Author Contributor

interesting, ok well I would recommend the latter inside a pull request =P

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;
},

browser: {}
});

@@ -1063,3 +1063,75 @@ test("jQuery.when()", function() {
});
}
});

test("jQuery.subclass", function(){
expect(378);

var Subclass = jQuery.subclass(),
SubclassSubclass = Subclass.subclass(),
jQueryDocument = jQuery(document),
selectors, contexts, methods, method, arg, description;

jQueryDocument.toString = function(){ return 'jQueryDocument'; };

Subclass.fn.subclassMethod = function(){};
SubclassSubclass.fn.subclassSubclassMethod = function(){};

selectors = [
'body',
'html, body',
'<div></div>'
]

methods = [ // all methods that return a new jQuery instance
['eq', 1],
['add', document],
['end'],
['has'],
['closest', 'div'],
['filter', document],
['find']
]

contexts = [undefined, document, jQueryDocument];

jQuery.each(selectors, function(i, selector){

jQuery.each(methods, function(){
method = this[0]
arg = this[1]

jQuery.each(contexts, function(i, context){

description = '("'+selector+'", '+context+').'+method+'('+(arg||'')+')';

same(
jQuery(selector, context)[method](arg).subclassMethod, undefined,
'jQuery'+description+' doesnt have Subclass methods'
);
same(
jQuery(selector, context)[method](arg).subclassSubclassMethod, undefined,
'jQuery'+description+' doesnt have SubclassSubclass methods'
);
same(
Subclass(selector, context)[method](arg).subclassMethod, Subclass.fn.subclassMethod,
'Subclass'+description+' has Subclass methods'
);
same(
Subclass(selector, context)[method](arg).subclassSubclassMethod, undefined,
'Subclass'+description+' doesnt have SubclassSubclass methods'
);
same(
SubclassSubclass(selector, context)[method](arg).subclassMethod, Subclass.fn.subclassMethod,
'SubclassSubclass'+description+' has Subclass methods'
);
same(
SubclassSubclass(selector, context)[method](arg).subclassSubclassMethod, SubclassSubclass.fn.subclassSubclassMethod,
'SubclassSubclass'+description+' has SubclassSubclass methods'
);

});
});
});

});

0 comments on commit d483ce0

Please sign in to comment.
You can’t perform that action at this time.