Marboni
Marboni

Reputation: 2459

Extend custom object in class-extend.js style

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");

JSFiddle

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

Answers (2)

Yotam Omer
Yotam Omer

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

Bergi
Bergi

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");

(updated demo)

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

Related Questions