Acum ca am vazut cateva caracteristici ale framework-ului MooTools, sa vedem cum putem implementa mostenirea.
Am spus in articolul trecut ca o caracteristica importanta a MooTools este ca incearca sa aduca conceptele de mostenire din limbajele de programare OOP ca Java, in JavaScript. In acest sens, exista un obiect Class, iar folosirea sa este intuitiva. De exemplu (via Fronteers 2008):
var Animal = new Class({
initialize: function(name, sound){
this.name = name;
this.sound = sound;
},
eat: function(){
this.say(this.sound + '!');
},
say: function(message){
alert(this.name + ' says: ' + message);
}
});
var Cat = new Class({
Extends: Animal,
initialize: function(name){
this.parent(name, 'meow');
},
eat: function(food){
if (food instanceof Mouse)
this.parent();
else
this.say("Yuck! I only eat mice.");
}
});
var Mouse = new Class({
Extends: Animal,
initialize: function(name){
this.parent(name, 'squeek');
}
});
var tom = new Cat('tom');
var jerry = new Mouse('jerry');
tom.eat(jerry); //alerts 'tom says: meow!'
Exemplul acesta ar trebui sa fie destul de usor de inteles, iar daca vrem sa aflam mai multe, este suficient sa consultam documentatia. Aflam astfel ca putem crea o noua “clasa” instantiind un obiect Class, care primeste ca unic parametru un obiect si are ca efect adaugarea tuturor membrilor din obiectul dat ca parametru, ca membrii ai noii clase. Exista insa 3 proprietati care pot aparea ca parametrii ai constructorului, care au o semnificatie speciala:
initialize, daca este prezent, va fi constructorul clasei nou create (si este deci apelat la instantierea clasei)Extendstrebuie sa aiba ca valoare o instanta a lui Class, si are ca efect faptul ca orice metoda a noii clase care acelasi nume cu o metoda din clasa pe care o extinde, are acces la un membruparentprin care poate apela metoda din clasa extinsa (si un exemplu de utilizare este chiar primul exemplu de mai sus: in clasaMouse, metodainitialize(deci constructorul, cum spuneam mai sus) apeleaza metodainitializedin clasa pe care o extinde:Animal, astfel ca fiecare instanta deMouseva avea variabila name setata la parametrul transmis constructorului, iar variabilasoundva avea intotdeauna valoarea'squeek'ca urmare a constructorului luiAnimal).Implementsprimeste ca parametru un obiect, o instanta deClasssau un vector de obiecte Object sau obiecte Class, si are ca efect copierea tuturor membrilor parametrului transmis (sau tuturor elementelor din vectorul transmis) ca parametru ca membri in clasa nou creata. Atentie, daca avem de-a face cu un vector si doua din elemente contin membri cu acelasi nume, elementul cu indexul cel mai mare in vector va suprascrie metodele oricarora dintre metodele cu acelasi nume ale altor elemente din vector. In plus, daca una din metode este redeclarata si atunci cand construim noua clasa, aceasta va suprascrie tot. Mai mult, orice metoda a unui membru transmis prin intermediulImplementsnu va avea acces laparentchiar daca noua clasa are si un parinte definit prinExtends, insa daca metoda este redefinita explicit, accesul laparenteste posibil.
Inca o proprietate interesanta este faptul ca oricand dupa ce cream o clasa noua, putem adauga noi membri si noi metode clasei apeland metoda Class.implements, care primeste parametru un obiect si copiaza toti membrii sai ca membrii ai clasei.
Astfel, prin folosirea obiectului Class pentru a crea “clase” in JavaScript, se poate evita complet folosirea prototipului obiectelor (vezi Obiecte in JavaScript) – chiar daca de fapt, in implementarea interna a MooTools, toate mecanismele de creare de clase folosesc tot prototipuri de obiecte.
Observati totusi ca desi MooTools incearca sa aduca cateva concepte din OOP Java in JavaScript, asemanarea se opreste intr-un punct – JavaScript este in continuare JavaScript si ramane valabil faptul ca nu are nimic in comun cu Java, oricat ar incerca MooTools sa le apropie pe cele doua si sa abstractizeze crearea de noi clase.
O ultima observatie legata de clase in MooTools: exista un modul MooTools (Class.Extras) care adauga inca trei caracteristici interesante lucrului cu clase: inlantuirea de functii (eng. function chaining) – adica o serie de functii care se executa una dupa terminarea alteia -, adaugarea de evenimente claselor (astfel ca se pot atasa evenimente generice, si ascultatori pentru aceste evenimente, unei clase), si adaugarea de optiuni unei clase (de fapt, aceste optiuni sunt extrem de folositoare atunci cand vrem de exemplu sa adaugam valori implicite pentru anumiti parametri). Vom pune in practica aceste concepte intr-un articol viitor.
Data viitoare, vom vorbi despre elementele de programare functionala puse la dispozitie de MooTools.

The Framework-uri JavaScript: Clase in MooTools by Interfeţe Web, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-Share Alike 3.0 Romania License.