• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Vererbung funktioniert nicht

MarcusDidius

New member
Hallo,

ich versuche mich mit Vererbung in JS zu beschäftigen.

Code:
function Shape() {
    this.name = 'Shape';
    this.toString = function() {
        return name;
    };
}

function TwoDShape() {
    this.name = '2DShape';
}


function Triangle(side, height) {
    this.name = 'Triangle';
    this.side = side;
    this.height = height;
    this.getArea = function() {
        return side * height * 1/2;
    };
}


TwoDShape.prototype = new Shape();
Triangle.prototype = new TwoDShape();

TwoDShape.prototype.constructor = TwoDShape;
Triangle.prototype.constructor = Triangle;

var t = new Triangle(2, 3);
console.log(TwoDShape.prototype);
console.log(t.toString());

Die Zeile console.log(t.toString()); gibt nur einen Leerstring aus. Ich hätte erwartet, dass sie 'Triangle' ausgibt. Was mache ich falsch?

Vielen Dank,

Hans
 
Die function Triangle() gibt nichts zurück, daher kommt auch nichts. Warum sollte sie auch was zurückgeben?
 
übrigens:
Code:
var t = new Triangle(1, 2);
t.height = 3;
t.side = 4;
console.log(t.getArea()); // 1 !!!
 
Ich hab den Fehler gefunden:

toString()
muss
this.name
zurückgeben (nicht einfach name)

@mikdo
Das soll ein Constructor sein
(nicht auf meinen Mist gewachsen, hab ich aus
Oliver Zeigermann: JavaScript für Java Entwickler und Stefanov, Sharma: Object Oriented JavaScript)
 
seit ECMAScript 5 kann man das auch etwas weniger kompliziert mit Object.create() und object factories machen.
 
Warum sollte sie auch was zurückgeben?
Das ist ja auch ein Konstruktor und wird auch mit new aufgerufen. Und dann kommt da this zurück.

@marcus: "Vererbung" so in JS nachzubilden ist nicht wirklich gut, bzw. hat starke Limitierungen. Ich würde das auch über Object.create machen.

PS: Dass wegen der nicht deklarierten Variable "name" eine Meldung in der Fehlerkonsole kommt, liegt wieder daran, dass window.name definiert ist... der Browser macht einem manchmal das Debuggen wirklich schwer...
 
Zurück
Oben