gruss Axel,
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 ;-)).
durchaus nicht.
OOP ohne Trennung von Class und Object, also von Beschreibung des
Objektes und reeller Objekt-Instanz im Arbeitsspeicher ist nicht
sinnvoll.
warum?
Prototyping ist für mich _keine_ OOP. Es werden einfach nur mehrere
Objekt-Instanzen erzeugt, die in Verbindung miteinander stehen.
das ist nur eine andere art der vererbung, deshalb aber noch lange
nicht weniger oo.
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.
hier haben wir die klassisch statische vererbung wo schon zur
compile-zeit die klassenhierarchie fest (statisch eben) definiert
wird.
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).
die dynamischen vererbung baut darauf, dass objekthierarchien waehrend
der laufzeit geschaffen und _veraendert_ werden koennen. dafuer sind
prinzipbedingt nun mal objekte (mit Deinen worten bzw. in den termen
"klassischer oo": instanzen der superklassen) die in ECMAScript dann
(objekt-)prototypen sind erforderlich.
So bekommen es die JavaScript-Programmierer hin, dass ein Browser
das System mit 100% Prozessor- und 100% Speicherauslastung lahmlegt.
.. uuh .. boes' geflamt. fuer das menschlein, aber auch ohne ein
einziges objekt vom typ "mensch" wird im beispiel gerade mal ein
*overhaed* von drei objektprototypen (EchterMensch, Menschenaffe,
Menschenartiger) erzeugt. bei den dreien bleibt es dann aber auch,
bis der scripting host stirbt - interpretierte sprachen leben nun
mal gerne in grosszuegigen raeumen. Aber selbst bei kompexeren
anwendungen zwingst Du den browser nicht ueber vererbung in die knie.
vielen JavaScript-programmierern gelingt dies hingegen muehelos ueber
DOM mit unreferenzierten "document.getElementById"-orgien.
das von Dir erweiterte bsp. liesse sich dank des prototypen-konzepts
wiederum wie folgt vereinfachen:
var Menschenartiger = function (name) {
alert("Menschenartiger");
this.name = name;
};
Menschenartiger.prototype.setName = function (name) { // ein setter-prototyp genuegt;
this.name = name;
alert("prototypen methode: " + arguments.callee);
};
var Menschenaffe = function (name) {
this.constructor = arguments.callee; // ueberschreibt "Menschenartiger";
alert("Menschenaffe");
this.name = name;
//durch den prototypen schon implementiert:
//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;
//durch den prototypen schon implementiert:
//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);
viele Grüße
danke,
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
ich nehme sowohl die
deutsche ausgabe der 4. englischen auflage von David Flanagans
Javascript-bibel "JavaScript. Das umfassende Referenzwerk."
O'REILLY / Juni 2002 / ISBN: 3897213303
sowie das nach meinem geschmack gelungenere
"JavaScript Developer's Dictionary" von Alexander J. Vincent
SAMS / Juni 2002 / English / ISBN: 0672322013
als auch die "ECMAScript Language Specification" (Standard ECMA-262) zur hand.
by(t)e by(t)e - peterS. - pseliger@gmx.net
"Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive." - Douglas Crockford