Struppi: Vererbung

Beitrag lesen

ich hab ein Problem bei der Vererbung in Javascript.

var chart = function(target){
this.ctx = target.getContext("2d");
}

var pieChart = function(target,config){
this.constructor(target);
//Verarbeite config etc.
}

pieChart.prototype = new chart();


>   
> In der letzten Zeile erfolgt die Vererbung.  
  
Genau über dieses Problem hatte ich schon auf meinem Blog angefangen zu schreiben, bin aber noch nicht so weit gekommen, meine Lösung zu präsentieren.  
  

> Gibt es einen Weg zu vererben ohne den Konstruktor der Elternklasse direkt aufzurufen?  
  
Nicht einen direkten. Ein halbwegs brauchbaren Ansatz (es fehlt die z.b. Mehrfachvererbung) von mir sieht so aus:  
  
~~~javascript
Function.prototype.Extend = function(b) {  
    var o = this;  
    var proto = b.prototype || b;  
  
    function Chain() {}  
    Chain.prototype = proto;  
  
    function Class() {}  
    Class.prototype = new Chain;  
  
    // inherit the prototype of this Function  
    for(var f in o.prototype) {  
        Class.prototype[f] = o.prototype[f];  
        if(typeof Class.prototype[f] == 'function') Class.prototype[f]._super = proto[f];  
    }  
    o.prototype = Class.prototype;  
    o.prototype.constructor = o;  
    o.prototype._parent = b;  
  
    Class.prototype._super = function() {  
	var c = Class.prototype._super.caller;  
        if(!c._super && this._parent) { // Konstruktorcall?  
            var parent = this._parent, ret;  
            var proto = o.prototype;  
  
            this._parent = this._parent.prototype._parent;  
            ret = parent.apply(this, arguments);  
            this._parent = parent;  
            return ret;  
		} else if(!c._super) throw new Error('Function has no _super function.\n' + c +'');  
        return c._super.apply(this, arguments)  
    }  
};  
  
var chart = function(target){  
        this.ctx = target.getContext("2d");  
}  
  
var pieChart = function(target,config){  
        this._super(target);  
        //Verarbeite config etc.  
}  
  
pieChart.Extend(chart);  

Wenn du keine prototypen benutzt, dann reicht aber auch das aus:

  
var chart = function(target){  
        this.ctx = target.getContext("2d");  
}  
  
var pieChart = function(target,config){  
        chart.call(this, target);  
        //Verarbeite config etc.  
}  
  

Struppi.