Make sure subclass is a proper subclass not just subclassing the fn methods. Fixes #7979.
This commit is contained in:
parent
7f95a730e5
commit
e00f74c43b
2 changed files with 52 additions and 1 deletions
|
@ -961,14 +961,16 @@ jQuery.extend({
|
||||||
function jQuerySubclass( selector, context ) {
|
function jQuerySubclass( selector, context ) {
|
||||||
return new jQuerySubclass.fn.init( selector, context );
|
return new jQuerySubclass.fn.init( selector, context );
|
||||||
}
|
}
|
||||||
|
jQuery.extend( true, jQuerySubclass, this );
|
||||||
jQuerySubclass.superclass = this;
|
jQuerySubclass.superclass = this;
|
||||||
jQuerySubclass.fn = jQuerySubclass.prototype = this();
|
jQuerySubclass.fn = jQuerySubclass.prototype = this();
|
||||||
jQuerySubclass.fn.constructor = jQuerySubclass;
|
jQuerySubclass.fn.constructor = jQuerySubclass;
|
||||||
jQuerySubclass.subclass = this.subclass;
|
jQuerySubclass.subclass = this.subclass;
|
||||||
jQuerySubclass.fn.init = function init( selector, context ) {
|
jQuerySubclass.fn.init = function init( selector, context ) {
|
||||||
if (context && context instanceof jQuery && !(context instanceof jQuerySubclass)){
|
if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) {
|
||||||
context = jQuerySubclass(context);
|
context = jQuerySubclass(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
|
return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
|
||||||
};
|
};
|
||||||
jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
|
jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
|
||||||
|
|
|
@ -1130,6 +1130,55 @@ test("jQuery.when() - joined", function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
test("jQuery.subclass", function(){
|
test("jQuery.subclass", function(){
|
||||||
|
expect(18);
|
||||||
|
var Subclass = jQuery.subclass();
|
||||||
|
Subclass.extend({
|
||||||
|
topLevelMethod: function() {return this.debug;},
|
||||||
|
debug: false,
|
||||||
|
config: {
|
||||||
|
locale: 'en_US'
|
||||||
|
},
|
||||||
|
setup: function(config) {
|
||||||
|
this.extend(true, this.config, config);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Subclass.fn.extend({subClassMethod: function() { return this;}});
|
||||||
|
|
||||||
|
//Test Simple Subclass
|
||||||
|
ok(Subclass.topLevelMethod() === false, 'Subclass.topLevelMethod thought debug was true');
|
||||||
|
ok(Subclass.config.locale == 'en_US', Subclass.config.locale + ' is wrong!');
|
||||||
|
same(Subclass.config.test, undefined, 'Subclass.config.test is set incorrectly');
|
||||||
|
equal(jQuery.ajax, Subclass.ajax, 'The subclass failed to get all top level methods');
|
||||||
|
|
||||||
|
//Create a SubSubclass
|
||||||
|
var SubSubclass = Subclass.subclass();
|
||||||
|
|
||||||
|
//Make Sure the SubSubclass inherited properly
|
||||||
|
ok(SubSubclass.topLevelMethod() === false, 'SubSubclass.topLevelMethod thought debug was true');
|
||||||
|
ok(SubSubclass.config.locale == 'en_US', SubSubclass.config.locale + ' is wrong!');
|
||||||
|
same(SubSubclass.config.test, undefined, 'SubSubclass.config.test is set incorrectly');
|
||||||
|
equal(jQuery.ajax, SubSubclass.ajax, 'The subsubclass failed to get all top level methods');
|
||||||
|
|
||||||
|
//Modify The Subclass and test the Modifications
|
||||||
|
SubSubclass.fn.extend({subSubClassMethod: function() { return this;}});
|
||||||
|
SubSubclass.setup({locale: 'es_MX', test: 'worked'});
|
||||||
|
SubSubclass.debug = true;
|
||||||
|
SubSubclass.ajax = function() {return false;};
|
||||||
|
ok(SubSubclass.topLevelMethod(), 'SubSubclass.topLevelMethod thought debug was false');
|
||||||
|
same(SubSubclass(document).subClassMethod, Subclass.fn.subClassMethod, 'Methods Differ!');
|
||||||
|
ok(SubSubclass.config.locale == 'es_MX', SubSubclass.config.locale + ' is wrong!');
|
||||||
|
ok(SubSubclass.config.test == 'worked', 'SubSubclass.config.test is set incorrectly');
|
||||||
|
notEqual(jQuery.ajax, SubSubclass.ajax, 'The subsubclass failed to get all top level methods');
|
||||||
|
|
||||||
|
//This shows that the modifications to the SubSubClass did not bubble back up to it's superclass
|
||||||
|
ok(Subclass.topLevelMethod() === false, 'Subclass.topLevelMethod thought debug was true');
|
||||||
|
ok(Subclass.config.locale == 'en_US', Subclass.config.locale + ' is wrong!');
|
||||||
|
same(Subclass.config.test, undefined, 'Subclass.config.test is set incorrectly');
|
||||||
|
same(Subclass(document).subSubClassMethod, undefined, 'subSubClassMethod set incorrectly');
|
||||||
|
equal(jQuery.ajax, Subclass.ajax, 'The subclass failed to get all top level methods');
|
||||||
|
});
|
||||||
|
|
||||||
|
test("jQuery.subclass()", function(){
|
||||||
expect(378);
|
expect(378);
|
||||||
|
|
||||||
var Subclass = jQuery.subclass(),
|
var Subclass = jQuery.subclass(),
|
||||||
|
|
Loading…
Reference in a new issue