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.