MooTools 1.2 - podstawy podstaw cz.3
02 lipca, 2008
W poprzedniej części kursu opisałem podstawowe funkcje rdzenia MooTools 1.2, pora rozwinąć ten temat i omówić pozostałe części najważniejszego fragmentu tego frameworka.
Przyjrzymy się teraz bliżej funkcjom związanym z ... funkcjami :) Chodzi mi tu o : $empty, $arguments, $lamba i $try.
Puste funkcje też są przydatne
Jeżeli zdarzyło się Wam przeglądać kody źródłowe jakichś skryptów to czasami spotkać można było w nich zapis:
function(){}
przypisany do jakiejś właściwości obiektu (najczęściej). Otóż gdy będziemy pisać w MooTools, często okaże się, że potrzebujemy do jakiejś opcji/właściwości przypisać pustą funkcję. W MooTools to zadanie jest ułatwione gdyż zamiast stosować wcześniej wspomniany zapis, wystarczy zapisać:
wlasciwosc: $emptyco jest równoznaczne zapisowi:
wlasciwosc: function(){}
Cel istnienia funkcji $empty ? Nie ma się co doszukiwać tutaj głębszego sensu - funkcja ta ma nam po prostu zwiększyć czytelność kodu i skrócić zapis, nic więcej (zresztą czego można spodziewać się po pustej funkcji :P).
Poproszę n-ty argument !
Jeżeli ktoś miałby potrzebę stworzenia funkcji zwracającej n-ty argument, to może powiedzieć, że o niego zadbano - funkcja $arguments pozwala stworzenie funkcji zwracającej podany argument.
Przykładowo gdybyśmy chcieli, żeby funkcja nTyArgument zwracała 5 argument:
var nTyArgument = $arguments(4); nTyArgument(1,2,3,4,5,6);
Zostanie zwrócona wartość 5.
Podobnie jak poprzednio chodzi tu głównie o skrócenie zapisu dzięki gotowym szablonom funkcji.
Gdy potrzeba zwrócić argument
Ktoś by się zapytał jaki jest sens tworzenia funkcji typu:
var dziwnaFunkcja = function(i){ return i; }
Bo przecież równie dobrze można by wpisać w miejsce użycia danej funkcji zwykłą wartość. Czasami jednak zdarza się potrzeba by jakiś argument lub właściwość był/a funkcją (spotkacie się z tym przy zdarzeniach lub w momencie spolszczania interfejsu Google Maps API ;) - wtedy funkcje o prezentowanej wcześniej budowie są niezbędne. I znów MooTools dba o nasze klawiatury - byśmy nie pisali na nich zbyt wiele kodu - zapis:
$lambda(x);
jest równoważny zapisowi:
function(x){ return x; }
Jakby nie patrzeć jest on sporo krótszy.
Sprawdźmy czy to wypali
Pamiętacie funkcję $pick ? Pora na jej odpowiednika, który zamiast sprawdzać czy dana zmienna jest zdefiniowana, sprawdzi czy dana funkcja zadziała poprawnie. Jeżeli jakaś z podanych funkcji wykona się poprawnie zostanie zwrócona wartość przez nią zwracana, a w przeciwnym wypadku zostanie zwrócona wartość null. Weźmy pod uwagę następujący przykład:
$try( function(){ return test1; }, function(){ return test2; }, function(){ return test3; } );
Żadna z trzech funkcji nie zadziała poprawnie, ponieważ wszystkie trzy odwołują się do nieistniejących zmiennych. Ale gdybyśmy zastosowali następujący kod:
var test2 = 10; $try( function(){ return test1; }, function(){ return test2; }, function(){ return test3; } );
To zwrócona zostanie wartość 10 z wywołania drugiej funkcji. Nie muszę chyba dodawać, że jeżeli uruchamiamy funkcję $try na wielu funkcjach to powinny one zwracać ten sam typ danych ? No chyba, że chcemy potem sprawdzać co w ogóle otrzymaliśmy po wywołaniu funkcji $try.
Bogatszy obiekt Array
Pamiętam jak swego czasu rwałem włosy z głowy pisząc swój pierwszy UserJS dla Opery. Za każdym razem dostawałem w konsoli błędów mnóstwo linijek błędów, ale nie wiedziałem skąd. I wtedy odkryłem, że zbyt zawierzyłem developerom Opery - otóż Opera nie obsługuje metody forEach obiektu Array natywnie. Dlatego też w MooTools metoda ta jest dodawana do obiektu Array już na początku, a dodatkowo ma utworzony alias each - by jak się pewnie domyślacie skrócić jeszcze ten dość często używany zapis (często się tej metody używa - przynajmniej ja tak mam :P).
Mniej zorientowanym w temacie metody Array.forEach przypominam jej składnię:
tablica.forEach(function(element, indeks){ // kod wykonywany dla każdego elementu tablicy });
oczywiście równoważny zapis to:
tablica.each(function(element, indeks){ // kod wykonywany dla każdego elementu tablicy });
Obiekty iterowalne
Są takie zmienne w JavaScript, które nie są tablicami, ale z użyciem funkcji $A czy $each mogą nabrać zachowań tablicy - chodzi tu głównie o kolekcje elementów drzewa dokumentu.
Zatem zapis:
$A(zmienna);
Zamienia zmienną na tablicę na której można dalej operować metodami obiektu Array, natomiast funkcja $each:
$each(zmienna, function(){/* operacje */});
Spowoduje wykonanie na każdej składowej zmiennej danej funkcji - zmienna to obiekt typu Hash, Array lub tablica arguments.
Jak zwykle rozchodzi się głównie o zwięzłość zapisu - jak zresztą w większości wypadków prezentowanych w tej części kursu.
Podsumowanie
W tej części kursu MooTools 1.2 zapoznaliśmy się z funkcjami, które są gotowymi rozwiązaniami często stosowanych zapisów oraz poznaliśmy nowe możliwości obiektu Array jakie implementuje MooTools 1.2 . W kolejnej części kursu skupimy się na obiektach, a zwłaszcza na obiekcie Hash.
Komentarze do wpisu "MooTools 1.2 - podstawy podstaw cz.3":
Jeszcze nie ma żadnych komentarzy. Twój może być pierwszy.
Dodaj komentarz: