Sie sind hier 585
Prototypen verwenden
1
Hier rufen wir spot.sit zum
ersten Mal auf. Spot hat noch
keine sitting-Eigenschaft.
2
Also untersuchen
wir den Prototyp
und stellen fest,
dass sitting den
Wert false hat.
3
Hier erhält this.sitting den Wert
true. Dadurch bekommt Spot
eine eigene sitting-Eigenschaft
mit dem Wert true.
function bark() {
// Code zum
Bellen
}
function bark() {
//
Code zum
Bellen
}
function bark() {
//
Code zum
Bellen
}
function sit() {
// Sitzcode
}
species: "Hund"
Dog Prototype
bark()
run()
wag()
sit()
sitting: false
name: "Spot"
breed: "Chihuahua"
weight: 5
Dog
bark()
4
Hier rufen wir spot.sit zum
zweiten Mal auf. Diesmal
hat Spot eine eigene sitting-
Eigenschaft mit dem Wert true.
function bark() {
// Code zum
Bellen
}
function bark() {
//
Code zum
Bellen
}
function bark() {
//
Code zum
Bellen
}
function sit() {
// Sitzcode
}
species: "Hund"
Dog Prototype
bark()
run()
wag()
sit()
sitting: false
name: "Spot"
breed: "Chihuahua"
weight: 5
sitting: true
Dog
bark()
Noch einmal: die Funktionsweise der sitting-Eigenschaft
Wir wollen sichergehen, dass Sie das verstanden haben. Wenn Sie nämlich zu schnell vorgehen,
verpassen Sie möglicherweise die Schlüsseldetails. Hier das Wichtigste: Wenn wir den Wert von
sitting zum ersten Mal auslesen, kommt er vom Prototyp. Wenn wir sitting aber auf true
setzen, passiert das in der Objektinstanz und nicht im Prototyp. Bei einer erneuten Abfrage
von sitting kommt der Wert jetzt von der Objektinstanz, da wir den Wert des Prototyps
überschrieben haben. Lassen Sie uns das noch einmal Schritt für Schritt durchgehen:
Folgen Sie diesem Ablauf
Schritt für Schritt (in der
Reihenfolge
1
, 2, 3, 4).
586 Kapitel 13
hasOwnProperty verwenden
Da wir gerade von Eigenschaften
sprechen: Gibt es eine Möglichkeit,
im Code herauszufinden, ob die
verwendete Eigenschaft aus der
Instanz oder vom Prototyp stammt?
Ja, die gibt es. Jedes Objekt besitzt eine hasOwnProperty-Methode.
Sie gibt true zurück, wenn eine Eigenschaft in der Objektinstanz definiert
wurde. Ist der Rückgabewert stattdessen false und Sie können trotzdem
auf die Eigenschaft zugreifen, wurde die Eigenschaft offenbar im Prototyp
definiert.
Das wollen wir für Fido und Spot einmal ausprobieren. Wir wissen, dass die
Eigenschaft species nur im Hund-Prototyp definiert wurde und dass weder
spot noch fido diese Eigenschaft überschrieben hat. Wenn wir die Me-
thode hasOwnProperty aufrufen und ihr den Eigenschaftsnamen "species"
übergeben, sollte das Ergebnis für beide false sein:
spot.hasOwnProperty("species");
fido.hasOwnProperty("species");
spot.hasOwnProperty("sitting");
spot.sitting = true;
spot.hasOwnProperty("sitting");
fido.hasOwnProperty("sitting");
Beide geben den Wert false
zurück, weil species im Prototyp
und nicht in den Objektinstanzen
für spot und fido definiert ist.
Das wollen wir jetzt für die sitting-Eigenschaft ausprobieren. Wir
wissen, dass sitting im Prototyp definiert und mit dem Wert false
initialisiert wurde. Wenn wir spot.sitting den Wert true zuweisen, wird
die sitting-Eigenschaft des Prototyps überschrieben und in der spot-
Instanz definiert. Danach überprüfen wir, ob Spot und Fido eine eigene
sitting-Eigenschaft haben:
Dieser Aufruf von hasOwnProperty
gibt true zurück, weil spot jetzt
seine eigene sitting-Eigenschaft
besitzt.
Aber dieser Aufruf von hasOwnProperty gibt false zurück, weil
die fido-Instanz noch keine eigene sitting-Eigenschaft besitzt.
Das bedeutet, die von fido verwendete sitting-Eigenschaft
wird nur im Prototyp definiert und von fido geerbt.
Bei der ersten Überprüfung, ob das spot-Objekt seine
eigene sitting-Eigenschaft besitzt, ist das Ergebnis false.
Dann setzen wir spot.sitting auf
true, wodurch der spot-Instanz
diese Eigenschaft hinzugefügt wird.
Sie sind hier 587
Prototypen verwenden
Wir haben die Roboter Robby und Rosie mit einer neuen Fähigkeit versehen: Durch die
reportError-Methode können sie jetzt Bescheid sagen, wenn es einen Fehler gibt. Sehen Sie
sich den unten stehenden Code an und achten Sie dabei besonders darauf, wie die Methode
ihre Fehlerinformationen erhält und ob sie aus dem Prototyp oder aus der Instanz stammen.
Schreiben Sie unten die Ausgaben des Codes auf:
function Robot(name, year, owner) {
this.name = name;
this.year = year;
this.owner = owner;
}
Robot.prototype.maker = "ObjectsRUs";
Robot.prototype.errorMessage = "Alle Systeme bereit.";
Robot.prototype.reportError = function() {
console.log(this.name + " sagt: " + this.errorMessage);
};
Robot.prototype.spillWater = function() {
this.errorMessage = "Oh oh, ich habe einen Kurzschluss!";
};
var robby = new Robot("Robby", 1956, "Dr. Morbius");
var rosie = new Robot("Rosie", 1962, "George Jetson");
rosie.reportError();
robby.reportError();
robby.spillWater();
rosie.reportError();
robby.reportError();
console.log(robby.hasOwnProperty("errorMessage"));
console.log(rosie.hasOwnProperty("errorMessage"));
Hat Robby seine
eigene errorMessage-
Eigenschaft?
Und Rosie?
Übung

Get JavaScript-Programmierung von Kopf bis Fuß now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.