peterS.: Vererbung

Beitrag lesen

gruss molily,

function Menschenartiger (Name) {
  this.Name = Name;
}
function Menschenaffe (Name) {
  this.constructor(Name);
}
Menschenaffe.prototype = new Menschenartiger();
...

/*
   zur rekapitulation (fuer mich und andere?) -

bis hierher passiert folgendes:

der prototyp des konstruktors "Menschenaffe" und damit auch der
   prototyp jedes objekts vom typ "menschenaffe" ist ein objekt vom
   typ "menschenartiger" mit der undefinierten eigenschaft "Name".

die eigenschaft "Name" eines "bonobo"-objektes -

var bonobo = new Menschenaffe("bonobo");

- wird zunaechst vom prototypen des objektes bestimmt und ist
   wegen  "Menschenaffe.prototype = new Menschenartiger()"
   unmittelbar am anfang des konstruktoren-aufrufs noch "undefined".
   der konstruktor "Menschenaffe" definiert selbst keine "Name"-
   eigenschaft fuer objekte vom typ "menschenaffe", sondern reicht
   das "Name"-argument wiederum nur an seinen eigenen prototypen-
   konstruktor ("Menschenartiger") weiter. erst an dieser stelle
   der konstruktionskaskade bekommt ein jedes "menschenaffe"-objekt
   seine eigene "Name"-eigenschaft zugewiesen.
 */

...
function EchterMensch (Name) {
  this.constructor(Name);
}
EchterMensch.prototype = new Menschenaffe();

function Mensch (Name) {
  this.constructor(Name);
}
Mensch.prototype = new EchterMensch();

var molily = new Mensch("Mathias");

alert(molily.Name);

...
Ferne frage ich mich, ob das doppelte Aufrufen des Prototyp-
Konstruktors (new EchterMensch() und this.constructor(Name))
einmal mit und einmal ohne Parameter in der Praxis bei
komplexeren Anwendungen Probleme verursachen kann. Falls ja,
müsste man tatsächlich das Setzen von Eigenschaften anhand
der Parameter in jeder Konstruktorfunktion wiederholen.

mit der von Dir im beispiel gewaehlten vorgehensweise bleibst
   Du beschwerdefrei - komplexere Anwendungen verlangen dann
   moeglicherweise nach einem voellig anderen aufbau der
   konstruktoren.

Ist das gängige Praxis?

was praxis ist, weiss ich nicht - ich implementiere zueinander
   in beziehung stehende konstruktoren jedesmal ein wenig anders.

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.

Dein beispiel wuerde ich so umsetzen:

var Menschenartiger = function (name) {
     this.name = name;
   };
   var Menschenaffe = function (name) {
     this.constructor = arguments.callee; // ueberschreibt "Menschenartiger";
     this.name = name;
   };
   Menschenaffe.prototype = new Menschenartiger("Menschenaffe");

var EchterMensch = function (name) {
     this.constructor = arguments.callee; // ueberschreibt "Menschenaffe";
     this.name = name;
   };
   EchterMensch.prototype = new Menschenaffe("EchterMensch");

var Mensch = function (name) {
     this.constructor = arguments.callee; // ueberschreibt "EchterMensch";
     this.name = name;
   };
   Mensch.prototype = new EchterMensch("Mensch");

var molily = new Mensch("Mathias");

alert("molily.name = " + molily.name +
     "\n\nmolily.constructor = " + molily.constructor +
     "\n\n(molily.constructor === Mensch) ? " + (molily.constructor === Mensch) +
     "\n(molily.constructor === EchterMensch) ? " + (molily.constructor === EchterMensch) +
     "\n(molily.constructor === Menschenaffe) ? " + (molily.constructor === Menschenaffe) +
     "\n(molily.constructor === Menschenartiger) ? " + (molily.constructor === Menschenartiger) +
     "\n\n(molily instanceof Mensch) ? " + (molily instanceof Mensch) +
     "\n(molily instanceof EchterMensch) ? " + (molily instanceof EchterMensch) +
     "\n(molily instanceof Menschenaffe) ? " + (molily instanceof Menschenaffe) +
     "\n(molily instanceof Menschenartiger) ? " + (molily instanceof Menschenartiger)
   );

by(t)e by(t)e - peterS. - pseliger@gmx.net

--
ie:( fl:) br:> va:| ls:& rl:| n4:} ss:} de:µ js:} zu:]