Reputation: 2459
I'm using class-extend.js to implement simple inheritance in my JS code:
var Man = Class.extend({
init: function(name) {
this.name = name;
}
});
var Mr = Man.extend({
init: function(name) {
this._super("Mr. " + name);
}
});
var mrBean = new Mr("Bean");
How should I modify script to make inheritance from object that implemented without class-extend.js?
function AnotherMan(name) {
this.name = name;
}
...
?
Upvotes: 2
Views: 570
Reputation: 15356
The following will achieve what you're looking for: (working jsFiddle). It uses the prototype chain in order to achieve classical inheritance.
function AnotherMan(name) {
this.name = name;
}
function Mr(name) {
AnotherMan.call(this, name); // Call the superclass's constructor in the scope of this.
this.name = "Mr. " + name; // Add an attribute to Author.
}
Mr.prototype = new AnotherMan(); // Set up the prototype chain.
Mr.prototype.constructor = Mr; // Set the constructor attribute to Mr.
var mrBean = new Mr("Bean");
You can generalize this into a function: (Another Working jsFiddle)
function extend(subClass, superClass) {
var F = function() {};
F.prototype = superClass.prototype;
subClass.prototype = new F();
subClass.prototype.constructor = subClass;
subClass.superclass = superClass.prototype;
if(superClass.prototype.constructor == Object.prototype.constructor) {
superClass.prototype.constructor = superClass;
}
}
and use it like this:
function AnotherMan(name) {
this.name = name;
}
function Mr(name) {
Mr.superclass.constructor.call(this, name);
this.name = "Mr. " + name;
}
extend(Mr, AnotherMan);
var mrBean = new Mr("Bean");
Upvotes: 0
Reputation: 664297
You can use .call()
on the extend
function. This expects a init
prototype method to point to the constructor:
function AnotherMan(name) {
this.name = name;
}
AnotherMan.prototype.init = AnotherMan; // = AnotherMan.prototype.constructor;
var Mr = Class.extend.call(AnotherMan, {
init: function(name) {
this._super("Mr. " + name);
}
});
var mrBean = new Mr("Bean");
Of course, it might be easier to use the native Correct javascript inheritance instead of that Class
library…
function AnotherMan(name) {
this.name = name;
}
function Mr(name) {
AnotherMan.call(this, "Mr. " + name);
}
Mr.prototype = Object.create(AnotherMan.prototype, {
constructor: {value: AnotherMan}
});
var mrBean = new Mr("Bean");
Upvotes: 2