Uvod u Objektno-Orjentisani JavaScript

Sadržaj

1.                  1. JavaScript  

2.                  2. Objektno-orjntisano programiranje

3.                  3. Terminologija

4.                  4. Prototipski-bayirano programiranje

5.                  5. JavaScript Objektno Orjentisano Programiranje

1.                                          5.1. Osnovni Objects

2.                                          5.2. Izvedeni Objects

1.                                                                  5.2.1. Klasa

2.                                                                  5.2.2. Objekat (Instanca klase)

3.                                                                  5.2.3. Konstruktor

4.                                                                  5.2.4. Properti (strinuti objekta)

5.                                                                  5.2.5. Metode

6.                                                                  5.2.6. Nasleđivanje (Inheritance)

7.                                                                  5.2.7. Ucaurivanje (Encapsulation)

8.                                                                  5.2.8. Apstarkcija (Abstraction)

9.                                                                  5.2.9. PPolimorfiyam (Polymorphis)

6.                  6. Napomene

7.                  7. Reference

JavaScript ima jake objektno-orjentisane programske mogućnosti iako se o tome diskutuje zbog razlika u načinu primene objektno-orjentisanog  pristupa u JavaScript-u i drugim jezicima.

Ovde ćemo početi sa kratkim uvodom u objektno-orjentisano programiranje, zatim ćemo napraviti pregled JavaScrip objeknog modela i na kraju ćemo demonstrirati koncept objektno-orjentisanog programiranja u JavaScript-u.

JavaScript 

Ako se ne osećate familijarno sa JavaScript-om možete najpre da pročitate Osnove JavaScript jezika.

Objektno-orjentisano programiranje

Objektno orjentisano programiranje (OOP) je nova programska paradigma koja koristi apstrakciju za kreiranje modela realnog sveta. OOP koristi razne tehnike iz ranije ustanovljenih programskih paradigmi kao što su modularnost, polimorfizam i učaurivanje (encapsulation). Danas mnogi programski jezici (kao što su Java, JavaScript, C#, C++, Python, PHP, Ruby itd.) podržavaju objektno orjentisano programiranje.

Objektno orjentisano programiranje se može posmatrati kao projektovanje softvera korišćenjem skupa objekata koji međusobno kooperiraju, za razliku od tradicionalnog pogleda u kojem je program skup funkcija ili samo lista instrukcija zadatih kompjuteru na izvršavanje. U OOP, svaki objekat je sposoban da prima poruke, da obradjuje podatke i da šalje poruke drugim objektima. Svaki objekat može biti posmatran kao jedna nezavisna mašina sa svojom posebnom ulogom i odgovornošću.

Pomoću OOP se postiže veća fleksibilnost i lakše održavanje programa i zato je OOP veoma  naročito kod većih softverskih projekata. Zbog posebno istaknute modularnosti, OO kod se lakše razvija i bolje razume nego što je slučaj kod klasičnog programiranja.

Terminologija

Klasa (Class)

Pomoću klase se definišu karakteristike Objekta.

Objekat (Object)

Predstavlja konkretizaciju (Instance) Klase.

Konstruktor(Constructor)

Metod koji se poziva pri konkretizaciji objekta.

Properti (Property)

Karakteristika (atribut) objekta, na primer boja objekta.

Metod (Method)

Sposobnost (funkcionalnost) objekta, kao na primer sposobnost hoda.

Nasleđivanje (Inheritance)

Klasa može da nasledi karakteristike neke druge klase.

Učaurivanje (Encapsulation)

Samo klasa definiše karakteristike objekta, a samo metod definiše sposobnosti (funkcije) koje objekat poseduje.

Apstrakciaj (Abstraction)

Metode i properti (atributi) simuliraju realnost koja se modelira objektima (klasama).

Polimorfizam (Polymorphism)

Različite klase mogu definisati iste metode i atribute..

Za detaljiji opis OOP pogledajte  Object-oriented programming u Wikipedia.

Prototipski-bazirano pogramiranje

Prototipski-bazairano programiranje je jedan od stilova OOP programiranja u kojem nema klasa, a nasleđivanje se postiže procesom dekorisanja postojećih objekata koji služe kao prototipovi. Ovaj model je poznat i kao bez-klasno, prototipski orjentisano ili instancama-orjentisano programiranje

JavaScript Objektno Orjentisano Programiranje

Osnovni Objekti

JavaScripr ima više objekata koji su definisani u samom jeziku kao što su na primer Math, Object, Array i String objekti. Sledeći primer pokazuje korišćenje Math objekta da se dobije pseudo-slučajan broj pomoću metode random().

alert(Math.random());

Napomena: Ovaj kao i naredni primeri koriste fukciju pod imenom alert. Funkcija alert zapravo nije deo JavaScript jezika.

Svaki objekat u JavaScript-u je jedna instanca objekta Object pa tako nasleđuje sve njegove atribute i metode.

Izvedeni objekti

Klasa

JavaScript je prototipski bazirani jezik koji nema naredbu za klasu kako je to slučaj u C++, Javi ili C#. To može malo da zbunjije programere koji su navikli na jezike sa naredbom za klasu. Umesto toga, JavaScript koristi funkciju kao klasu. Definisanje klase je jednsotavno kao i definisanje funkcije. U donjem primeru definišemo novu klasu Osoba.

function Osoba() { }

Objekat (Instanca klase)

Za kreiranje nove instance nekog objekta obj koristimo naredbu  new obj, pridružujući rezultat kreiranja (koji je tipa obj) nekoj varijabli za kasniju upotrebu.

U primeru koji sledi definisaćemo klasu Osoba i kreiraćemo dve instance (osoba1 i osoba2).

function Osoba() { }

var osoba1 = new Osoba();

var osoba2 = new Osoba();

Konstruktor

Konstruktor se poziva u mmomentu kreiranja instance objekta. Konstruktor je metod klase čiji se objekat kreira. U JavaScript-u, funkcija kojom se definiše klasa igra ulogu konstruktora objekata; pa zbog toga nema potrebe da se definise poseban metod konstruktor.

Konstruktor se obično koristi da se postave vrednosti atributa (propertija) objekta ili da se poyovu metode koje pripremaju korišćenje objekat. Dodavanje metoda klasama postiže se sintaksom koja će biti kasnije prikazana.

U primeru koji sledi konstruktor klase Osoba generiđe poruku u trenutju kada se vrši konkretizacija objekta.

function Osoba() {

  alert('Osoba je konkretizovana');

}  

var osoba1 = new Osoba();

var osoba2 = new Osoba();

Properti (atribut objekta)

Properti su varijable sadržane u klasi; svaka instanca objekta će imati ove properti-je.

Propertiji moraju biti setovani putem ptototip propertija klase (funkcije) kako bi nasleđivanje bilo korektno.

Rad sa propertijima unutar klase postiže se ključnom reči this, koja označava tekući objekat. Pristupanje (čitanje ili pisanje) propertija van klase postiže se sledećom sintaksom: InstanceName.Property; ista takva sintaksa se koristi i u C++, Java, i mnogim drugim jezicima. (Unutar klase se sintaksa this.Property koristi za get ili set vrednosti propertija)

U primeru koji sledi definisaćemo properti  pol za klasu Osoba class i zadaćemo joj vrednost prilikom konkretizacije.

function Osoba(pol) {

  this.pol = pol;

  alert('Osoba je konkretizovana');

}

Osoba.prototype.pol = 'Osoba Pol';

var osoba1 = new Osoba('Musko');

var osoba2 = new Osoba('Zensko');

//prikaži pol osobe

alert('osoba1 je ' + osoba1.pol);

Metode

Metode slede istu logiku kao i propertiji; razlika je u tome što su metode funkcije i moraju biti definisani kao funkcije. Pozivanje metoda je slično pristupanju propertijima, ali se sada dodaju zagrade() posle imena metode uz moguće argumente unutar zagrada.

U primeru koji sledi definisaćemo i koristiti metodu reciZdravo() za klasu Osoba.

function Osoba(pol) {

  this.pol = pol;

  alert('Osoba je konkretizovana');

}

Osoba.prototype.pol = 'Osoba Pol';

Osoba.prototype.reciZdravo = function()

{

  alert ('Zdravo');

}

var osoba1 = new Osoba('Musko');

var osoba2 = new Osoba('Zensko');

 

// poziv reciZdravo metoda.

osoba1.reciZdravo();

Nasleđivanje (Inheritance)

Nasleđivanje je način na koji se kreira klasa kao specijalizovana verzija jedne ili više drugih klasa ( JavaScript podržava samo nasleđivanje od jedne klase). Specijalizovana klasa se onično naziva klasa-dete (child), a klasa od koje se vrši nasleđivanje klasom-roditeljem (parent). U JavaScript-u se nasleđivanje postiže pridruživanjem instance klase-roditelja klasi-dete, a zatim se napravi specijalizacija.

U primeru koji sledi, definisćemo klasu  Student kao klasu-dete klse Osoba. Zatim ćemo redefinisati metodu  reciZdravo() i dodati metodu reciCao().

// definisemo klasu Osoba

function Osoba() {}

 Osoba.prototype.hod = function(){};

Osoba.prototype.reciZdravo = function(){

  alert ('Zdravo');

};

// definisemo klasu Student

function Student() {}

// nasledjivanje od klase Osoba

Student.prototype = new Osoba();

// definise konstruktor da bude Student a ne Osoba

Student.prototype.constructor = Student;

// zamenjujemo metod sreciZdravo

Student.prototype.reciZdravo = function(){

  alert('Zdravo, ja sam student');

}

// dodajemo novi metod reciCao

Student.prototype.reciCao = function(){

  alert('Cao');

}

var student1 = new Student();

student1.reciZdravo();

student1.reciCao();

Učaurivanje (Encapsulation)

U prethodnom primeru Student klasa ne mora da zna kako  klasa Osoba implementira metod  hod() , ali može da koristi taj metod; klasa Student ne mora da ponovo definiše taj metod ukoliko ne želi da ga menja. To se naziva učaurivanjem pomoću koga svaka klasa nasleđuje metode od klase-roditelja i samo kad želi da ih menja mora da ih redefiniše.

Apstrakcija (Abstraction)

Apstrakcija je mehanizam koji nam omogućava da modeliramo problem na kojem radimo. To se može postići nasleđivanjem (specijalizacijom) ili kompozicijom. JavaScript postiže specijalizaciju nasleđivanjem a kompoziciju tako što instanca neke klase može biti vrednost atributa nekod drugog objekta.

Tako JavaScript Function klasa nasleđuje od Object klase (to je primer specijalizacije) a Function.prototype properti je jedna instanca Object klase(to je primer kompozicija)

var f = function(){};

alert( 'f is a Function: ' + (f instanceof Function) );

alert( 'f.prototype is an Object: ' + (f.prototype instanceof Object) );

Polimorfizam (Polymorphism)

Pošto se sve metode i propertiji (atributi, svojstva) definišu unutar prototip propertija, različite klase mogu definisati metode sa istim imenom.

Napomene

Tehnike objektno orjentisanog programiranja koje su ovde prikazane nisu jedine koje se mogu koristiti u JavaScript-u, koji je vrlo fleksibilan u načinima kako se OOP može primeniti.

Postoje i druge tehnike koje omogućavaju još naprednije OOP u JavaScript-ua, ali to izlazi iz domena ovog teksta.

Reference

  1. Mozilla. "Core JavaScript 1.5 Guide", http://developer.mozilla.org/en/docs...ript_1.5_Guide
  2. wikipedia. "Object-oriented programming", http://en.wikipedia.org/wiki/Object-...ed_programming