can
Version:
MIT-licensed, client-side, JavaScript framework that makes building rich web applications easy.
105 lines (83 loc) • 2.91 kB
Markdown
Construct.super
can.Construct.plugins
can/construct/super
can/construct/super/test.html
http://donejs.com/can/dist/can.construct.super.js
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.
{...[*]} args 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' `[can.Construct::init init]` and `[can.Construct::setup setup]`, but it can be used in any inheriting function.
The `Person` and `Programmer` examples from `[can.Construct::init init]` demonstrate `_super`'s use.
Here's how those classes look without can.Construct.super:
```
var Person = can.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](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/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);
}
}, {});
```
can.