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');
}
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.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