Przyszła pora na omówienie kwestii związanych z obiektami w MooTools. W tej części kursu omówię podstawowe funkcje frameworka operujące na obiektach : $extend, $merge, $splat, $unlink jak i zapoznamy się z podstawową implementacją obiektu Hash wraz z jego podstawowymi metodami: getLength, forEach i getClean.

Łączenie i rozszerzanie obiektów

Funkcja $extend pozwala nam rozszerzyć dany obiekt o nowe właściwości, a funkcja $merge pozwala złączyć kilka obiektów w jeden obiekt zawierający właściwości wszystkich łączonych obiektów.

Funkcję $extend można wywołać na dwa sposoby:

$extend(obiektPodstawowy,obiektRozszerzenie);

lub:

Obiekt.extend = $extend;
Obiekt.extend(obiektRozszerzenie);

W obu wypadkach następuje nadpisanie właściwości obiektu jeżeli się powtarzają w podawanych jako argumenty obiektach.

Dla przykładu przyjmijmy, że mamy trzy obiekty:

przegladarka = {
    nazwa: "Lisek",
    wersja: 3
}
 
oprogramowanie = {
    wersja: 5,
    wlasciciel: "Dziudek"
}
 
 
system = {
    wersja: 6
}

Jeżeli teraz wykonamy operację:

$extend(przegladarka,oprogramowanie);

To otrzymamy obiekt postaci:

{
    nazwa: "Lisek",
    wersja: 5,
    wlasciciel: "Dziudek"
}

Jak widać nie występujące w obiekcie przegladarka właściwości zostały dodane do końcowego obiektu, a właściwość wersja została zmieniona na wartość z obiektu oprogramowanie (z powodu tej samej nazwy, decyduje oczywiście kolejność obiektów. Jak to mówią - ostatni będą pierwszymi ;).

W wypadku funkcji $merge:

$merge(przegladarka,oprogramowanie);

Otrzymalibyśmy taki sam obiekt, ale już po wykonaniu kodu:

$merge(przegladarka,oprogramowanie,system);

Otrzymamy:

{
    nazwa: "Lisek",
    wersja: 6,
    wlasciciel: "Dziudek"
}

Zanim ktoś powie, że te funkcje działają prawie tak samo (poza liczbą argumentów), dodam jeszcze, że w wypadku funkcji $merge operacja rozszerzania/aktualizowania właściwości następuje także wtedy gdy jedna z właściwości jest obiektem (tj. mamy zagnieżdżone obiekty). Zatem weźmy dwa nowe obiekty:

strona = {
    title: "test",
    body: {
        menu: "opcje",
        stopka: "copyright"
    }
}
 
nowaStrona = {
    title: "drugi test",
    body: {
        tresc: "tekst",
        stopka: "All right reserved"
    }
}

W wypadku funkcji $extend:

$extend(strona,nowaStrona);

Otrzymamy obiekt postaci:

{
    title: "drugi test",
    body: {
        tresc: "tekst",
        stopka: "All right reserved"
    }
}

Natomiast w wypadku $merge:

$merge(strona,nowaStrona);

Zostanie zwrócony taki obiekt:

{
    title: "drugi test",
    body: {
        menu: "opcje",
        tresc: "tekst",
        stopka: "All right reserved"
    }
}

Jak widać w $extend właściwość body nie została rozszerzona tylko zamieniona, natomiast takie działanie miało miejsce w przypadku funkcji $merge.

Pozbywamy się obiektu Hash

Funkcja $unlink powoduje zamianę wszystkich obiektów typu Hash na zwykłe obiekty (typ Object). Dzięki rekurencyjnemu mechanizmowi działania możemy dokonać takiej zamiany zarówno na obiekcie typu Hash jak i tablicy oraz obiekcie zawierającym hashe:

$unlink(TablicaHashLubObiekt);

Bezwarunkowa zamiana na tablicę

Pozostała nam jeszcze funkcja $splat, która zamienia wszystko co nie jest tablicą w obiekt typu Array. Oczywiście nie w taki sposób jak funkcja $A - po prostu jeżeli jako argument tej funkcji podamy obiekt, to zostanie zwrócona tablica jednoelementowa zawierająca tenże obiekt:

$splat(10);

Zwróci tablicę postaci:

[10]

Natomiast kod:

$splat({1:"a",2:"b"});

Zwróci tablicę:

[{1:"a",2:"b"}]

Chodzi tu o sytuacje gdy potrzebujemy tablicy w danym miejscu - podobnie jak z funkcją $lambda omawianej w poprzednich częściach kursu.

Obiekt Hash - podstawy

MooTools 1.11 posiadał plugin Hash.js, jednak podczas tworzenia MooTools 1.2 uznano obiekt Hash za jeden z ważniejszych w projekcie i włączono go do grupy Natives, czyli obiektów związanych z obiektami natywnymi JavaScript. Obiekt Hash to po prostu rozszerzona wersja obiektu natywnego Object, a jak sama nazwa wskazuje jest to coś na wzór tablicy asocjacyjnej (czyli tablicy gdzie występują pary klucz-wartość).

Aby stworzyć nowy obiekt typu Hash wystarczy następujący zapis:

new Hash({obiektZamienianyNaHash});

Ponieważ MooTools coraz bardziej dba o osoby, które nie lubią dużo pisać, więc mamy też do dyspozycji funkcję $H, która działa analogicznie do wcześniej wspomnianego kodu:

$H({obiektZamienianyNaHash});

Tak stworzony obiekt typu Hash ma dzięki plikowi Core.js zaimplementowane 3 podstawowe metody: getLength, forEach (która ma także od razu dodany alias each) oraz getClean.

Metoda getLength zwraca ilość par klucz-wartość w danym hashu:

var nowyHash = $H({"test1":1,"test2":2});
nowyHash.getLength();

Powyższy kod zwróci nam wartość 2. Działanie forEach jest analogiczne do działania tej metody w obiekcie Array, dla przypomnienia - składnia:

obiektHash.forEach(function(el, i){
    /*   
       w tej części kodu zmienna el zawiera wartość, a
       zmienna i zawiera klucz tejże wartości
    */
});

Jeżeli chcemy zamienić nasz Hash z powrotem na obiekt to służy ku temu ostatnia z omawianych w tym wpisie funkcji czyli getClean:

var nowyHash = $H({"test1":1,"test2":2});
nowyHash.getClean();

Powyższy zapis spowoduje stworzenie obiektu typu Hash o długości 2, a następnie jego zamianę na zwykły obiekt.

Podsumowanie

Podstawy podstaw MooTools 1.2 mamy za sobą - w następnej części kursu zajmiemy się detekcją przeglądarek i zdobywaniem informacji o systemie operacyjnym użytkownika.

Komentarze do wpisu "MooTools 1.2 - podstawy podstaw cz.4":

Jeszcze nie ma żadnych komentarzy. Twój może być pierwszy.

Dodaj komentarz:

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