T
Tersus
Gast
Guten Tag,
vorweg: falls jemand für mich googeln will, ist nicht nötig, das kann ich selber. Es gibt zum Thema Prototypen dutzende Tutorials und ich habe sicher schon 6 davon intensiv durch.
Ich, als jemand, der klassenorientierte Programmierung vollständig beherrscht, blicke absolut nicht durch, was die Vererbung in JavaScript betrifft. Ich weiß nicht, warum ich mich so schwer damit anstelle.
Laut aller Tutorials verweißt der Prototyp eines Objekts auf sein darüber liegendes Objekt. Entspricht also eine super in Java.
Ich stelle mir das wie eine verkette Liste vor. Eine Katze ist ein Tier und erbt entsprechend von Tier. Ein Tier ist ein Lebewesen und erbt entsprechend von Lebewesen. Der JavaScript Vererbungsbaum müsse so aussehen:
[Katze] --> [Tier] --> [Lebewesen]
Der Prototyp von [Katze] ist also [Tier] und dessen Prototyp ist [Lebewesen]. Der Prototyp von Lebewesen ist [Object] und dessen Prototyp ist null, weil es die oberste "Klasse" ist.
Ich greife mal folgendes Tutorial auf: http://blog.mayflower.de/4451-JS-Vererbung-Prototypen.html
In diesem Beispiel soll der [Customer] vom [User] erben.
[User] sieht so aus.
Hier sind viele Sachen für mich total missverständlich!
Wir greifen auf den Prototypen von [user] zu. Das ist doch im Moment [object]? Also weisen wir die Funktionen "setIp" und und "setLastVisit" [object] zu ...
Meines Irrwissens nach müsste die Klasse so aussehen:
Als nächstes folgt aus dem Tutorial die Klasse [Customer]. Diese ist auch meinem Irrwissen nach fast richtig aufgebaut.
Ich verstehe nicht, wieso der Kopf nicht so function Customer( ... ){ ... } aussieht.
Zuletzt aus dem Tutorial die Vererbungssetzung:
Zeile 1. verstehe ich so, dass der Prototyp von [Customer], also das Oberobjekt, nun auf [User] gesetzt wird.
Die Zeile 2. ist schon wieder komisch. Wir greifen auf den Konstruktor des Prototypen von [Customer], also den Konstruktor von [User], zu und weisen ihm das Objekt [Customer] zu!? Customer.constructor hätte ich noch ansatzweise akzeptiert, aber so ist das doch totaler unverständlich ...
Weiterhin wird die Vererbung erst nach dem Objektrumpf zugewiesen! Wie soll man dann den Konstruktor der "Oberklasse" aufrufen um an ihn die Parameter weiterzureichen!?
Im Moment ist JavaScript für mich total abartig.
Ich danke demjenigen vielmals, der sich meinem Problem annimmt und es mir so erklärt, dass ich es verstehe.
vorweg: falls jemand für mich googeln will, ist nicht nötig, das kann ich selber. Es gibt zum Thema Prototypen dutzende Tutorials und ich habe sicher schon 6 davon intensiv durch.

Ich, als jemand, der klassenorientierte Programmierung vollständig beherrscht, blicke absolut nicht durch, was die Vererbung in JavaScript betrifft. Ich weiß nicht, warum ich mich so schwer damit anstelle.
Laut aller Tutorials verweißt der Prototyp eines Objekts auf sein darüber liegendes Objekt. Entspricht also eine super in Java.
Ich stelle mir das wie eine verkette Liste vor. Eine Katze ist ein Tier und erbt entsprechend von Tier. Ein Tier ist ein Lebewesen und erbt entsprechend von Lebewesen. Der JavaScript Vererbungsbaum müsse so aussehen:
[Katze] --> [Tier] --> [Lebewesen]
Der Prototyp von [Katze] ist also [Tier] und dessen Prototyp ist [Lebewesen]. Der Prototyp von Lebewesen ist [Object] und dessen Prototyp ist null, weil es die oberste "Klasse" ist.
Ich greife mal folgendes Tutorial auf: http://blog.mayflower.de/4451-JS-Vererbung-Prototypen.html
In diesem Beispiel soll der [Customer] vom [User] erben.
[User] sieht so aus.
Code:
var User = function () {};
User.prototype.setIp = function (ip) {
this.ip = ip;
};
User.prototype.setLastVisit = function (date) {
this.lastVisit = date;
};
Hier sind viele Sachen für mich total missverständlich!
Wir greifen auf den Prototypen von [user] zu. Das ist doch im Moment [object]? Also weisen wir die Funktionen "setIp" und und "setLastVisit" [object] zu ...
Meines Irrwissens nach müsste die Klasse so aussehen:
Code:
function User() {
this.setIp = function (ip) {
this.ip = ip;
};
this.setLastVisit = function (date) {
this.lastVisit = date;
};
};
Als nächstes folgt aus dem Tutorial die Klasse [Customer]. Diese ist auch meinem Irrwissen nach fast richtig aufgebaut.
Code:
var Customer = function (name, email) {
this.name = name;
this.email = email;
};
Ich verstehe nicht, wieso der Kopf nicht so function Customer( ... ){ ... } aussieht.
Zuletzt aus dem Tutorial die Vererbungssetzung:
Code:
Customer.prototype = new User();
Customer.prototype.constructor = Customer;
Zeile 1. verstehe ich so, dass der Prototyp von [Customer], also das Oberobjekt, nun auf [User] gesetzt wird.
Die Zeile 2. ist schon wieder komisch. Wir greifen auf den Konstruktor des Prototypen von [Customer], also den Konstruktor von [User], zu und weisen ihm das Objekt [Customer] zu!? Customer.constructor hätte ich noch ansatzweise akzeptiert, aber so ist das doch totaler unverständlich ...

Weiterhin wird die Vererbung erst nach dem Objektrumpf zugewiesen! Wie soll man dann den Konstruktor der "Oberklasse" aufrufen um an ihn die Parameter weiterzureichen!?
Im Moment ist JavaScript für mich total abartig.

Ich danke demjenigen vielmals, der sich meinem Problem annimmt und es mir so erklärt, dass ich es verstehe.