Axel Richter: Vererbung

Beitrag lesen

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