Thread Ein paar Programmiertricks (39 answers)
Opened by roooot at 2008-03-22 23:16

KurtZ
 2008-03-27 14:12
#107539 #107539
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Struppi+2008-03-26 09:40:36--
KurtZ+2008-03-25 21:10:26--
ein Klassenobjekt wird als Funktion deklariert und kann höchstens erben:
Code: (dl )
  Klasse1.prototype= new Klasse0(); 


das folgende erzeugt aber ne Fehlermeldung
Code: (dl )
  Unterinstanz=new Instanz(); // Fehler: Instanz is not a constructor 


Deine erste Erläuterung verstehe ich nicht. Da es keine Klassen gibt, gibt es auch kein Klassenobjekt, jede Funktion ist erstmal per se ein Konstruktor ...


Jeder Konstruktor ist eine Funktion (und damit ein Objekt) mit einem Attribut "prototype"!
Also normale Funktionen "könnten" zu Konstruktoren werden, denn erst wenn man new auf sie anwendet, dann bekommen sie automatisch ein Unterobjekt prototype verpasst, sonst haben sie keins.

Man kann technisch also sehr gut unterscheiden zwischen Instanzobjekten und Konstruktorobjekten, letztere sollte man immer "Groß" schreiben und stehen technisch in Analogie zu Klassendefinitionen.

Bei diesem begetObject resp. clone Funktion werden im Grunde nur noch Konstruktorobjekte erzeugt und auf Instanzobjekte verzichtet.


Struppi+2008-03-26 09:40:36--
Im zweiten Fall könnte man sich noch behelfen in dem man schreibt:

Code: (dl )
  var Unterinstanz=new Instanz.constructor(); 


Wirklich? constructor liefert mir in meinen Tests das Ende der prototype-chain, also Urahn und nicht den Vater.


Struppi+2008-03-26 09:40:36--
Das sehe ich anders, Vererbung ist mit JS umständlich, einmal hast du keinen direkten Zugriff auf SUPER und zum zweiten wird durch new BasisKlasse() immer eine Instanz der Basis Klasse erzeugt, was zur Folge hat, das der Konstruktor aufgerufen wird und du dort aufpassen musst, wenn du eine für jede Instanz unterschiedliche Initialisierung machen willst, das geht in die Hose. Du musst entweder die Intialisierung in eine Funktion verlagern oder den Weg, den dir Don P im selfhtml Forum gezeigt hat wählen.


für constructor-chaining mit SUPER kannst du ja apply und call benutzen.
da der prototyp einer Klasse immer auch Instanz einer Superklasse ist muss man aufpassen, wie man Instanzen erzeugt, z.B. abhängig von den Parametern bei new.
TMTOWTDYOG (there's more than one way to dig your own grave)

View full thread Ein paar Programmiertricks