Gibt es einen Weg zu vererben ohne den Konstruktor der Elternklasse direkt aufzurufen?
Bei deinem (gekürzten?) Beispielcode macht eine »Vererbung« (bzw. Delegation, wie es in JavaScript letztlich umgesetzt ist) keinen Sinn. Was soll vererbt werden? Vermutlich die Eigenschaften des Prototype von chart, also chart.prototype. Was man üblicherweise tut ist folgendes:
1. Erzeuge ein Objekt, dass chart.prototype als Prototyp hat (die interne [[Prototype]]-Eigenschaft zeigt auf chart.prototype).
2. Nutze dieses Objekt als pieChart.prototype (und fülle es mit Eigenschaften und Methoden).
3. Rufe im Konstruktor pieChart den Konstruktor chart auf.
Implementierung:
1. Dafür gibt es in ECMAScript 5 die Methode Object.create(). Bis die alle Browser unterstützen, hilft man sich ab:
function Object_create (o) {
var F = function() {};
F.prototype = o;
return new F();
}
Anwendung:
Object_create(chart.prototype)
erzeugt ein Objekt, das Anfragen an unbekannte Eigenschaften an chart.prototype delegiert.
2. Zuweisung an pieChart.prototype:
pieChart.prototype = Object_create(chart.prototype);
Jetzt muss man noch den constructor-Verweis korrigieren, denn der wird mit dem Überschreiben von prototype mit überschrieben:
pieChart.prototype.constructor = pieChart;
Wenn man will, kann man jetzt noch einen Verweis auf den Super-Konstruktor bzw. den Super-Prototyp erzeugen.
3. Wende manuell den chart-Konstruktor auf die pieChart-Instanz an:
function pieChart (target, config) {
chart.call(this, target);
// ...
}
Das mag ungewohnt aussehen, aber JavaScript ist eine funktionale und prototypische, keine klassenbasierte Sprache, bei der es native Super-Calls gibt. Man kann mit viel Metaprogramming eine Pseudoklassen-Abstraktion erzeugen - das tun Bibliotheken wie Mootools, Prototype, Dojo usw. Das sieht dann schöner aus, dafür ist es unter der Haube sehr kompliziert.
Hintergründe:
http://molily.de/js/organisation-instanzen.html
http://molily.de/javascript-core/
Mathias