can-construct-super
can.Construct.super is a plugin that makes it easier to call base functions from inside inheriting functions.
construct._super([...args])
Calls the base constructor function's method.
Parameters
- args
{Any}:parameters to pass to the base function
With this plugin, functions that are inheriting from base functions
are provided with a specialized this._super reference to the base
function from which they inherit.
This is especially useful for calling base classes' init and setup, but it can be used in any inheriting function.
The Person and Programmer examples from init demonstrate _super's use.
Here's how those classes look without can.Construct.super:
var Person = Construct.extend({
init: function(first, last) {
this.first = first;
this.last = last;
}
});
var Programmer = Person.extend({
init: function(first, last, language) {
// call base's init
Person.prototype.init.apply(this, arguments);
// other initialization code
this.language = language;
},
bio: function() {
return "Hi! I'm " + this.first + " " + this.last +
" and I write " + this.language + ".";
}
});
And here's how Programmer works using _super:
var Programmer = Person.extend({
init: function(first, last, language) {
// call base's init
this._super(first, last);
// other initialization code
this.language = language;
},
bio: function() {
return "Hi! I'm " + this.first + " " + this.last +
" and I write " + this.language + ".";
}
});
If you want to pass an array of arguments (or an arguments object) to _super, use apply:
var Programmer = Person.extend({
init: function(first, last, language) {
// call base's init
this._super.apply(this, arguments);
// other initialization code
this.language = language;
},
bio: function() {
return "Hi! I'm " + this.first + " " + this.last +
" and I write " + this.language + ".";
}
});
_super on constructors
can.Construct.super also adds super to the constructor, so you
can use it in static functions.
Here is a base class that has a method that squares numbers and an inherited class that has a method that cubes numbers:
var Squarer = can.Construct.extend({
raise: function(n) {
return n*n;
}
}, {});
var Cuber = Squarer.extend({
raise: function(n) {
return n * this._super(n);
}
}, {});