Dieser Artikel ist Teil einer Serie:
Nachdem wir im vergangenen Teil der Serie gesehen haben wie man Mootoools-Objekte benutzt, wird es Zeit, sich um die Erstellung eigener Klassen zu kümmern. Dieser Artikel soll das Klassen- und Vererbungssystem in seinen Grundzügen darstellen. Wer objektorientierte Programmierung kennt, sollte sich diesbezüglich schnell zurechtfinden. Was man mit den Klassen tolles anstellen kann, soll dann Bestandteil des nächsten Teils sein.
Klassen erstellen
Die Klassen in Mootools lassen sich genau so verwenden, wie man es aus anderen (richtigen) objektorientierten Programmiersprachen kennt. Ein simples Beispiel:
var Huhn = new Class({
pick: function(){
alert('Pick, pick!')
}
});
So sieht die simpelste Form einer Mootools-Klasse aus. Unsere neue Klasse Huhn
hat mit pick()
eine Methode, die sich genau so aufrufen lässt, wie man das von anderen Objekten kennt:
var meinHuhn = new Huhn();
meinHuhn.pick(); // Alert: Pick, pick!
Klassen erweitern
Will man eine bestehende Klasse erweitern, muss man nur in der Extends
-Eigenschaft entsprechend notieren:
var Hahn = new Class({
Extends: Huhn,
kraeh: function(){
alert('Kikeriki!');
}
});
Die Klasse Hahn
erbt von der Klasse Huhn
alle Eigenschaften und Methoden – in diesem Fall die pick()
-Methode. Zusätzlich bringt Hahn
noch seine eigene kraeh()
-Methode mit:
var meinHahn = new Hahn();
meinHahn.pick(); // Alert: Pick, pick!
meinHahn.kraeh(); // Alert: Kikeriki!
Optionen benutzen
Um in die eigenen Klassen Funktionen aus anderen Klassen nutzbar zu machen, bietet sich die Implements
-Eigenschaft an. In diesem Fall wird die Options-Klasse implementiert, die es uns erlaubt, unsere Klassen mit zusätzlichen Optionen zu initialisieren.
var Henne = new Class({
Extends: Huhn,
Implements: Options,
options: {
startEier: 2
},
eier: 0,
initialize: function(options){
this.setOptions(options);
this.eier = this.options.startEier;
},
legeEi: function(){
this.eier++;
},
zaehleEier: function(){
alert(this.eier);
}
});
Die Henne
-Klasse erweitert die Huhn
-Klasse und erbt dadurch die pick()
-Methode. Sie implementiert die Options-Klasse und macht sich damit die setOptions()
-Methode zu Eigen. Außerdem hat Henne
mit initialize()
eine Constructor-Funktion, die die Variablen verarbeitet, die beim Erstellen der Klasse übergeben werden.
Henne
hat mit startEier
eine Option, die festlegt, wie viele Eier unser Federvieh als Startkapital bekommt. In der Klasse selbst ist in der 4. Zeile ein Standardwert (2) notiert, der von initialize()
überschrieben wird. Das sieht in der Praxis dann so aus:
meineHenne = new Henne();
meineHenne.zaehleEier(); // Alert: 2 (Standardwert)
var meineAndereHenne = new Henne({
startEier: 5
});
meineAndereHenne.zaehleEier(); // Alert: 5
Die Anzahl der Eier wird in der internen Variable eier
gespeichert. Mit der legeEi()
-Methode erhöht man den internen Ei-Counter um eins, während der Startwert weiterhin unter options.startEier
zu finden ist:
var meineHenne = new Henne({
startEier: 7
});
meineHenne.legeEi();
meineHenne.legeEi();
meineHenne.zaehleEier(); // Alert: 9
alert(meineHenne.options.startEier); // Alert: 7
Zusätzliche Methoden implementieren
In jede bestehende Klasse kann man nachträglich zusätzliche Methoden implementieren:
Huhn.implement({
scharr: function(){
alert('Scharr, scharr!');
}
});
var meinHuhn = new Huhn();
meinHuhn.scharr(); // Alert: Scharr, scharr
All das geht auch mit den Standardklassen von Mootools! Um mal ein Beispiel ohne Hühner zu nehmen, implementieren wir doch einfach mal eine Methode in die Element
-Klasse (die Klasse für alle HTML-Elemente), die die betroffenen Elemente komplett leer macht:
// Vorher: <div id="meinDiv">Ein <code>DIV</code> voller HTML!</div>
Element.implement({
empty: function(){
this.set('html', '');
}
});
$('meinDiv').empty();
// Nacher: <div id="meinDiv"></div>
Und weil, wir erinnern uns, alles in Mootools aus Objekten und Klassen besteht, können wir auch alles im Framework nach unserem Geschmack umkrempeln oder als Basis für eigene Kassen verwenden.
Und wozu das Ganze?
Nun ist es ja ganz nett, dass man Klassen erstellen und modifizieren kann, aber es drängt sich natürlich die Frage auf, wie man das Ganze effektiv nutzen kann. Im nächsten Teil der Serie werden wir wieder tutorialartig ein Beispiel durchgehen, das verdeutlichen wird, wie man sich mit Mootools-Klassen viel Arbeit ersparen kann.
Kommentare (14)
max ¶
3. August 2009, 18:14 Uhr
Wieder schöner Beitrag, aber eine Frage ist mir trotzdem aufgekommen: Durch die Implementierung der Optionsklasse können dann sozusagen Konstruktor-Parameter übergeben werden?
wetternest ¶
3. August 2009, 18:40 Uhr
ich hab diese objecte noch immer nicht verstanden. aber vll nach dem nächsten teil wenn ich mal seh wie man das verwendet...
looking forward
wn
max ¶
3. August 2009, 21:09 Uhr
Meinst du generell OOP?
wetternest ¶
4. August 2009, 15:22 Uhr
jop
ich weiß zwar ungefähr wie das geht aber ich kanns mir ned vorstellen. und ich hab auch noch ned so ganz durchschaut wozu das gut sein soll
Peter ¶
4. August 2009, 16:32 Uhr
In Teil 5 gibt es wieder ein praktisches Beispiel - das sollte dann für Klarheit sorgen.
Markus Thömmes ¶
5. August 2009, 01:03 Uhr
Ich muss dieses Tutorial dick fett loben. Ich habs tatsächlich hinbekommen, was mit Mootools eigenständig zu machen. Echt super mit ein bisschen Übung eröffnet sich mir endlich das Kundenfeld für JavaScript :).
noname ¶
5. August 2009, 10:48 Uhr
Hmm langsam habe ich das Gefühl das wäre ein Mootools blog. Gibt ja kaum noch interessantes hier und wenn man nach langem mal reinschaut findet man nur nen Haufen Mootools Einträge. Wie dem auch sei, so bleibt mein Besuch wenigstens kurz.
Markus Schlegel ¶
5. August 2009, 12:47 Uhr
Ich muss hier auch mal ein kurzes, aber herzliches Dankeschön aussprechen. JavaScript ist, war und wird wahrscheinlich auch nicht mein Fachgebiet, aber das „Ease of Use“, das sich mit jQuery oder Mootools einstellt, gefällt mir doch ganz gut.
Der Ansatz des „Alles ist ein Objekt“ hat mir schon bei Ruby gefallen, es kann gut sein, dass ich in nächster Zeit verstärkt Mootools zum Einsatz kommen lassen werde. Freue mich auf jeden Fall schon auf Teil 5.
Daniel ¶
20. August 2009, 09:00 Uhr
Hallo,
sehr schöne Serie, die mich mal wieder dazu animiert hat, etwas mehr mit mootools zu schaffen. Das Klassenkonzept hatte ich mir bisher nie richtig angesehen. Sehr schön erklärt das Ganze.
An dieser Stelle lege ich mal ein kleines Snippet ab, da ich keinerlei vernünftige Lösung bei der großen Suchmaschiene dafür gefunden hatte. Ich denke, darüber wird aber jeder stolpern, der das erste mal mit Klassen in mootools rumobert.
Problem war folgendes: Eine Klasse bauen, darin Elemente ins DOM einfügen. Diese Element sollten natürlich gleich events mitbekommen, damit ich damit mit ihnen irgendwas anstellen kann. Nun aber die Crux, ich möchte per 'this' die Methode innerhalb der Klasse auffrufen. Dort brauche ich aber wieder irgendwie eine Referenz auf das Element, damit ich beispielsweise die ID auslesen kann. Lösung: Statt this, die event-Eigenschaft auslesen. Simpel, wenn man weiß wie's geht ;)
Erscheint mir als ne gute Lösung, kann aber auch sein, dass das geschulte Auge draufschaut und mir das um die Ohren haut ;) Was sagst Du, ist der Ansatz richtig?
Daniel ¶
20. August 2009, 09:05 Uhr
Zitat Daniel:
Fix:
Peter ¶
24. August 2009, 19:43 Uhr
Zumindest auf die Schnelle kann ich da keine größeren Böcke erkennen. Kann man so machen.
Fabian ¶
4. August 2010, 12:21 Uhr
Hallo Peter,
ich hätte da auch mal eine Frage zu meinem Code:
...
prepare: function()
{
$(this.options.conID).getElements('li.toggler').addEvents({
'click':this.clickFunc()
});
},
clickFunc: function()
{
console.log("clickclickclick");
}
Nu meckert er, dass es die clickFunc() nicht gäbe, da er ja im Prinzip mit getElements().addEvents einen Loop macht und höchstwahrscheinlich "this" dann das aktuelle Element ist, welches ja diese Funktion richtigerweise nicht hat.
Aber wie adressiere ich es so, dass bei einem Klick meine Funktion "clickFunc" meiner Klasse aufgerufen wird?
Hast Du da einen Tipp für mich?
Fabian
Peter ¶
4. August 2010, 13:54 Uhr
Fabian ¶
4. August 2010, 14:28 Uhr
Zitat Peter:
Yay! Vielen Dank! Daran hatte ich nicht gedacht :)