Plik class.js to pierwszy z dwóch plików grupy Class we frameworku mootools. Zawiera on podstawowe funkcje przydatne przy programowaniu obiektowym w JavaScript. Grupa Class powstała dopiero w wersji 1.1 mootools - wcześniej funkcje, które oferuje były dostępne w plikach moo.js, event.js oraz common.js . Obecna forma podziału jest według mnie o wiele lepsza, choć framework składa się teraz z większej ilości części...

Tworzenie klas przy użyciu mootools jest bardzo proste - w najprostszym wypadku ograniczy się do zapisu:

var NowaKlasa = new Class();

Ale oczywiście w tym wypadku żadnego pożytku z takiej klasy mieć nie będziemy ;) Dlatego warto dodać do naszej klasy kod, który wykona się zaraz po jej stworzeniu - służy do tego metoda initialize. Przykładowy kod (Przy okazji zmienię nazwę klasy):

var Komputer = new Class({
   initialize: function(){
      alert('Komputer został stworzony :D');
   }
});

Dzięki zastosowaniu metody initialize po wystąpieniu zapisu:

var Pecet = new Komputer();

Pojawi się alert z odpowiednim tekstem.

A może chcemy by nasz komputer posiadał jakieś własne cechy ? Co to za komputer bez IP ;) Tak więc dodajmy przy inicjalizacji naszemu komputerkowi IP. Możemy to zrobić na dwa sposoby - sami zdecydować jakie IP będzie miał komputer, albo też dać użytkownikowi pole do popisu i pozwolić mu samemu wybrać. Zaprezentuje oba przypadki:

Sami nadajemy IP komputerowi:

var Komputer = new Class({
   initialize: function(){
      this.IP = '127.0.0.1';
   }
});

Dajemy możliwość podania IP komputera użytkownikowi przy inicjalizacji:

var Komputer = new Class({
   initialize: function(ip){
      this.IP = ip;
   }
});

IP jest od tej pory polem każdego obiektu klasy Komputer. Stwórzmy sobie teraz dwa komputery :

var Pecet = new Komputer();

powyższy kod dla pierwszego kodu z nadawanie IP komputerowi, a poniższy kod dla drugiego kodu:

var Pecet = new Komputer('192.168.0.1');

W obu wypadkach aby odczytać IP obiektu Pecet wystarczy zapis:

Pecet.IP;

To tak słowem wstępu o tworzeniu klas z użyciem mootools. A teraz przejdźmy do tego co jeszcze udostępnia nam plik class.js . Zacznijmy od metody empty - gdy tworzymy klasy zawierające kilka metod, może się zdarzyć potrzeba stworzenia pustej funkcji. Wtedy zamiast zapisu:

var Komputer = new Class({
   initialize: function(ip){
      this.IP = ip;
   },

   uruchom: function(){}
});

Możemy zastosować zapis:

var Komputer = new Class({
   initialize: function(ip){
      this.IP = ip;
   },

   uruchom: this.empty;
});

Oczywiście działanie metody jest natury nazwijmy to "uczytelniającej" ;) O wiele ciekawsze będą dla nas metody extend i implement.

extend

Jeżeli mamy dużo klas w projekcie to z pewnością pomiędzy nimi istnieją jakieś podobieństwa. Bazując już na znanej nam klasie Komputer - podobieństwo pomiędzy makiem, a PC będzie takie, że na pewno oba mają jakieś IP. Zatem zamiast tworzyć od podstaw klasy MAC i PC możemy rozszerzyć możliwości klasy Komputer. Do tego celu używamy właśnie metody extend. Gdy chcemy stworzyć klasę opartą o istniejącą już klasę zapiszemy:

var NowaKlasa = StaraKlasa.extend({
   initialize: function(nowa_cecha,stara_cecha){
      this.parent(stara_cecha);
      this.cecha = nowa_cecha;
   }
});

Powyższy kod spowoduje, że zapis:

var NowyObiekt = new NowaKlasa(nowa_cecha,stara_cecha);

Stworzy nowy obiekt oparty o klasę NowaKlasa, która posiada dwie właściwości - nowa_cecha i stara_cecha, przy czym zapis this.parent(stara_cecha) powoduje odwołanie do klasy StaraKlasa, która tworzy właściwość stara_cecha... Tak na sucho to pewnie ciężko to przyswoić ale myślę, że konkretne przykłady rozjaśnią sprawę ;)

Stwórzmy zatem dwie klasy - MAC i PC będące rozszerzeniem klasy Komputer:

var Komputer = new Class({
   initialize: function(ip){
      this.IP = ip;
   }
});

var PC = Komputer.extend({
   initialize: function(os,ip){
      this.parent(ip);
      this.system = os;
   }
});

var MAC = Komputer.extend({
   initialize: function(wyglad,ip){
      this.parent(ip);
      this.wyglad = wyglad;
   }
});

var Mak = new MAC('uroczy','127.0.0.1');
var Blaszak = new PC('linux','192.168.0.1');

Mamy zatem dwa obiekty i każdy z nich posiada po dwie właściwości - jedną dziedziczoną z klasy Komputer i jedną charakterystyczną tylko dla siebie - w wypadku klasy MAC jest to właściwość "wyglad", a w wypadku klasy PC jest to właściwość "system".

Oczywiście do właściwości odwołujemy się tak jak już wcześniej pokazywałem:

Mak.IP;
Mak.wyglad;
Blaszak.IP;
Blaszak.system;

Oczywiście rozszerzanie możliwości klasy metodą extend nie ogranicza się tylko do dodawania nowych pól - możemy też dodawać całe funkcje do klas bazujących na innej klasie - wszystko zależy od tego co umieścimy w argumentach metody extend ;)

implement

Czasami zachodzi potrzeba rozszerzenia funkcjonalności danej klasy, oczywiście można to zrobić za pomocą metody extend, ale po co generować sobie dodatkowe klasy ? Metoda extend przydaje się raczej gdy chcemy ujednolicić pewne właściwości wielu klas, a gdy chcemy sprawić by nasza klasa oferowała większe możliwości wykorzystajmy metodę implement. Służy ona do rozszerzania funkcjonalności danej klasy bez tworzenia nowych klas. Składnia tej metody wygląda następująco:

Klasa.implement({
   NowaFunkcja: function(argumenty){
      // kod nowej funkcji
   }
});

Po wykonaniu powyższego kodu nasza klasa będzie oferowała dodatkową funkcjonalność. To teraz bardziej konkretny przykład - oczywiście bazujący na klasie Komputer ;)

var Komputer = new Class({
   initialize: function(ip){
      this.IP = ip;
   }
});

Komputer.implement({
   uruchom: function(){
      alert('Komputer został uruchomiony...');
   }
});

Dzięki powyższemu zapisowi możemy teraz z powodzeniem stosować zapis:

var Blaszak = new Komputer('127.0.0.1');
Blaszak.uruchom();

Tym razem nie daję przykładów bo nie chcę Was zamęczyć alertami ;) Ale w następnej części kursu przykłady będą bo jest co pokazać ;)

W następnej części kursu przejdziemy do pliku class.extras.js , który zawiera więcej funkcji do operowania na klasach.

Komentarze do wpisu "Mootools 1.1 - Class.js":

1. Maciek napisał(a):
30 stycznia 2008, 21:28:44

Czesc. Bardzo ciekawy akrtykow. Ale mam pytanie – co jezeli mamy to:

var Komputer = new Class({ initialize: function(ip){ this.IP = ip; }
});

i z tego zrobimy:

var Komputer = new Class({ initialize: function(ip){ this.IP = ip; }, uruchom: function() { jakasFunkcja = (function() { this.IP += 2; }).periodical(2000); }
});

I jak zrobic zeby to IP sie zmienialo?
Zamiast this wstawiam parent ale nic sie nie zmienia…

2. Dziudek napisał(a):
01 lutego 2008, 12:16:53

@Maciek – no musisz przede wszystkim wywołać tą funkcję, która zmienia IP ;) Czyli w tym wypadku :

Komputer.jakasFunkcja();

;) Gdyby nie działało spróbuj:

var Komputer = new Class({ initialize: function(ip){ this.IP = ip;$this = this; }, uruchom: function() { jakasFunkcja = (function() { $this.IP += 2; }).periodical(2000); } });

Dodaj komentarz:

Textile Lite włączony ( szczegółowy opis znaczników ):
*strong* | # lista numerowana | * lista wypunktowana | _em_ | __italic__ | "link":http:// | bq. cytat.