Hallo,
das schoene an javascript ist, dass Du beim stricken von
komplexen oo-anwendungen ohne einengendes klassen-korsett
arbeiten darfst. oder anders: kein formalismus nimmt Dich
an die hand, um Dir den weg aus dem vererbungs-labyrinth
zu weisen.
Nein, es sei denn, Du meinst den letzten Satz sehr ironisch ;-)).
OOP ohne Trennung von Class und Object, also von Beschreibung des Objektes und reeller Objekt-Instanz im Arbeitsspeicher ist nicht sinnvoll. Prototyping ist für mich _keine_ OOP. Es werden einfach nur mehrere Objekt-Instanzen erzeugt, die in Verbindung miteinander stehen. Bei OOP kann aber eine Klasse eine andere erweitern _ohne_, dass ein Objekt der Superklasse vorhanden ist, einfach indem sie die Klasse beerbt. Instanziert wird nur ein Objekt.
Dein beispiel wuerde ich so umsetzen:
Ja, das ist immerhin besser als das vorherige, weil es bei überschriebenen Methoden die richtige[TM] nutzt.
falsch:
function Menschenartiger (Name) { this.Name = Name; }
Menschenartiger.prototype.parent = Menschenartiger
function Menschenaffe (Name) {
alert("Menschenaffe extends " + this.parent);
this.parent(Name);
this.setName = function(text) { this.name = text; alert("Methode von Menschenaffe"); }
}
Menschenaffe.prototype = new Menschenartiger();
function EchterMensch (Name) {
alert("EchterMensch extends " + this.parent);
this.parent(Name);
this.setName = function(text) { this.name = text; alert("Methode von Menschenaffe"); }
}
EchterMensch.prototype = new Menschenaffe();
function Mensch (Name) { alert("Mensch extends " + this.parent); this.parent(Name); }
Mensch.prototype = new EchterMensch();
var molily = new Mensch("Mathias");
alert(molily.Name);
molily.setName("Peter");
alert("molily.name = " + molily.name);
richtiger:
var Menschenartiger = function (name) {
alert("Menschenartiger");
this.name = name;
};
var Menschenaffe = function (name) {
this.constructor = arguments.callee; // ueberschreibt "Menschenartiger";
alert("Menschenaffe");
this.name = name;
this.setName = function(name) { this.name = name; alert("Methode von Menschenaffe"); }
};
Menschenaffe.prototype = new Menschenartiger("Menschenaffe");
var EchterMensch = function (name) {
this.constructor = arguments.callee; // ueberschreibt "Menschenaffe";
alert("EchterMensch");
this.name = name;
this.setName = function(name) { this.name = name; alert("Methode von EchterMensch"); }
};
EchterMensch.prototype = new Menschenaffe("EchterMensch");
var Mensch = function (name) {
this.constructor = arguments.callee; // ueberschreibt "EchterMensch";
alert("Mensch");
this.name = name;
};
Mensch.prototype = new EchterMensch("Mensch");
var molily = new Mensch("Mathias");
alert("molily.name = " + molily.name);
molily.setName("Peter");
alert("molily.name = " + molily.name);
Du siehst aber an den alerts, dass die Superklassen alle instanziert werden. Alle werden Objekte im Arbeitsspeicher und bleiben dort, bis molily stirbt ;-))(das Objekt molily). So bekommen es die JavaScript-Programmierer hin, dass ein Browser das System mit 100% Prozessor- und 100% Speicherauslastung lahmlegt.
viele Grüße
Axel
PS: Welche Quelle verwendest Du eigentlich jetzt als Spezifikation für JavaScript http://devedge.netscape.com/central/javascript/ ist tot. Mit Google finde ich zwar einige. Die sehen aber alle wie Sekundärquellen aus. http://synchro.net/docs/js/ref/contents.html, http://www.byteshift.de/javascript-1415/CoreReferenceJS15/index.html