dojo
Paul
- javascript
Moin, ich bin Anfänger in OOP und dojo.
Wenn ich in eine vorhandene Methode einer Class (von meinem Vorgänger) eine Veränderung machen muss, kann ich eine einzige Zeile in den Quelltext meines Vorgängers einfügen und es läuft so wie es sein soll.
Nun ist aber das Problem, dass ich die alten Sachen meines Vorgängers nicht verändern soll, sondern "nur" benutzen soll.
Wie kann ich die eine Zeile (in einer Methode einer Klasse) "von außen" ändern bzw. ergänzen?
Gruß, Paul
Hallo,
Wie kann ich die eine Zeile (in einer Methode einer Klasse) "von außen" ändern bzw. ergänzen?
das könntest du mit Vererbung realisieren.
Gruß
Kalk
hm, da kommt bei google was mit declare raus. passt das?
Hallo,
hm, da kommt bei google was mit declare raus. passt das?
würde mich wundern, das Schlüsselwort bei Vererbung sollte extends sein. Habe aber keine Ahnung wie bei JS die Vererbung funktioniert.
Gruß
Kalk
Moin!
Hallo,
hm, da kommt bei google was mit declare raus. passt das?
würde mich wundern, das Schlüsselwort bei Vererbung sollte extends sein. Habe aber keine Ahnung wie bei JS die Vererbung funktioniert.
Und dabei hat Molily das so schön erklärt…
// Das ist eine "Klasse"
function Katze () {
var schnurr="rrrrrrrrrrrrrrrrrrrrrrrrr";
this.schnurren = function () {
alert (schnurr);
}
};
var mauzi = new Katze(); // Objekt von Klasse ableiten
// Klasse mit Protyping erweitern
Katze.prototype.miau = function () {
alert("Miau!");
};
var sylvester = new Katze(); // Objekt von erweiterter Klasse ableiten
// … und so benutzt:
mauzi.schnurren();
sylvester.schnurren();
mauzi.miau();
(von mir erweitert)
Jörg Reinholz
Hallo,
[Und dabei hat Molily das so schön erklärt…]
mit anderen Worten das gesuchte Schlüsselwort ist weder "declare" noch "extends", sondern "prototype".
Gruß
Kalk
Moin!
mit anderen Worten das gesuchte Schlüsselwort ist weder "declare" noch "extends", sondern "prototype".
Jein, denn so ganz falsch hast Du nicht gelegen.
Jörg Reinholz
Moin!
<html>
<script>
// Das ist eine "Klasse"
function Katze () {
var schnurr="rrrrrrrrrrrrrrrrrrrrrrrrr";
this.schnurren = function (s="Katze") {
alert(s + ": " + schnurr);
}
};
var mauzi = new Katze(); // Objekt von Klasse ableiten
// Klasse mit Protyping erweitern
Katze.prototype.miau = function (s="Katze") {
alert(s + ": " + "Miau!");
};
Katze.prototype.miau = function (s="Katze") {
alert(s + ": " + "Mijau Mijau");
};
var sylvester = new Katze(); // Objekt von erweiterter Klasse ableiten
// … und so benutzt:
mauzi.schnurren('Mauzi');
sylvester.schnurren('Sylvester');
mauzi.miau('Mauzi');
sylvester.miau('Sylvester');
</script>
<body>
<h1>Katze</h1>
</body>
</html>
Unschön: Es werden auch bereits abgeleitete Objekte geändert und dabei Eigenschaften und Methoden überschrieben.
Jörg Reinholz
Hallo Jörg Reinholz,
Katze.prototype.miau = function (s="Katze") { alert(s + ": " + "Mijau Mijau"); };
Im Struwwelpeter drohen die Katzen Mienz und Maunz „Miau Mioh Miau Mioh“
Im Französischen heißen die übrigens Minz und Tristepatte (= traurige Pfote)
Bis demnächst
Matthias
Hallo Matthias Apsel,
Im Struwwelpeter drohen die Katzen Mienz und Maunz „Miau Mioh Miau Mioh“
Urheber: „Bundesarchiv B 145 Bild-F001104-0003, Köln, WDR Fernsehstudio“ von Bundesarchiv, B 145 Bild-F001104-0003 / Brodde / CC-BY-SA 3.0. Lizenziert unter CC BY-SA 3.0 de über Wikimedia Commons - https://commons.wikimedia.org/wiki/File:Bundesarchiv_B_145_Bild-F001104-0003,_Köln,_WDR_Fernsehstudio.jpg#/media/File:Bundesarchiv_B_145_Bild-F001104-0003,_Köln,_WDR_Fernsehstudio.jpg
Bis demnächst
Matthias
Hallo,
„Bundesarchiv
hey, du bist grad auf Rekordkurs im Threaddrifting!
Gruß
Kalk
Hallo Jörg
Unschön: Es werden auch bereits abgeleitete Objekte geändert und dabei Eigenschaften und Methoden überschrieben.
Das ist das Grundprinzip, nach dem Vererbung in JavaScript funktioniert. Sprich, vergleichbar mit der identifier resolution innerhalb der scope chain wird beim Zugriff auf eine Eigenschaft zunächst einmal geprüft, ob das jeweilige Objekt eine eigene Eigenschaft mit dem entsprechenden Bezeichner besitzt. Ist dies nicht der Fall, dann wird geprüft, ob der Prototyp des Objektes über eine solche Eigenschaft verfügt, und wenn dem so ist, diese Eigenschaft referenziert. War die Suche bei diesem Objekt jedoch ebenfalls ohne Erfolg, dann wird wiederum bei dessen Prototyp nachgesehen, und so weiter und so fort. Geerbte Eigenschaften sind hier also immer eigene Eigenschaften eines anderen Objektes.
Wird ein Instanzobjekt durch den Aufruf einer Funktion als Konstruktor erzeugt, dann bedeutet das, dass diese Funktion im Kontext des Objektes ausgeführt wird, die Funktionsvariable this also mit dem erstellten Objekt initialisiert wird. Die innerhalb des Konstruktors vorgenommenen Zuweisungen erzeugen mithin eigene Eigenschaften des auf diese Weise erstellten Objektes.
var Constructor = function ( ) {
'use strict';
this.foo = 1;
this.bar = 2;
};
Constructor.prototype.baz = 3;
var a = new Constructor( );
console.log(Object.getOwnPropertyNames( a )); // ['foo', 'bar']
var b = new Constructor( );
console.log(Object.getOwnPropertyNames( b )); // ['foo', 'bar']
Sowohl a als auch b verfügen hier nun über die eigenen Eigenschaften foo und bar, während baz eine eigene Eigenschaft des Objektes bleibt, welches der Wert von Constructor.prototype ist, denn da hier weder a noch b über eine eigene Eigenschaft mit dem Bezeichner baz verfügen, wird beim Zugriff auf die Eigenschaft in der Prototypenkette gesucht und dem zur Folge bei beiden Instanzobjekten Constructor.prototype.baz referenziert. Wird diese Eigenschaft nun verändert, dann betrifft diese Veränderung selbstverständlich auch beide Objekte, a und b.
Gruß,
Orlok
Hallo,
naja, aber ist das nicht einfach eine Erweiterung des Prototypes mit einer Funktion namens extends, die theoretisch auch "erweitere" heißen könnte? Also kein Schlüsselwort, sondern ein im Prinzip beliebiger Name.
JS strickt halt das ganze OOP-Voodoo ein bisschen anders als andere.
Gruß
Kalk