Professional Documents
Culture Documents
2019
─
Laze Nančića 34
21000 Novi Sad, Serbia
Sadržaj
Slika 1-2 Princip prikaza web stranice na osnovu učitanih datoteka sa servera
Način na koji se web stranice prikazuju na osnovu kôda i podataka dobijenih sa tražene adrese
prikazaćemo na primeru otvaranja stranice http://www.google.com.
Svaka web stranica definisana je svojom web adresom, odnosno URL-om (skraćeno od
Uniform Resource Locator). Ovaj URL (koji mi, kao korisnik, unosimo u adresno polje) će web
browseru omogućiti da zaključi kako i odakle može da dobavi stranicu koju treba da nam
prikaže. Za ovo će mu biti od koristi 2 osnovna dela web adrese:
1. Protokol - http://
2. Adresa - www.google.com
Ovde je bitno napomenuti da se za prikaz web sadržaja danas koriste dva protokola: http
(Hyper Text Transfer Protocol) i https (HTTP Secure), pri čemu je tendencija da se potpuno
pređe na https koji podržava šifrovanje prenetih podataka i predstavlja sigurniju verziju http-a.
Ukoliko ne unesemo protokol, browser će dopuniti ovaj deo za nas. Sam URL će omogućiti
browseru da locira konkretan HTML fajl koji treba da nam prikaže. Više detalja o tome kako
browser koristi web adrese za lociranje konkretnog računara koji servira željenu stranicu možete
pronaći u okviru na dnu ovog poglavlja.
Server koji se nalazi na željenoj lokaciji, nakon primanja zahteva, šalje web browseru HTML
stranicu koja se nalazi na zadatom URL-u (pretpostavimo da se radi o datoteci index.html
koja je prikazana na Slici 1-2). Nakon uspešnog preuzimanja browser će, čitajući red po red u
primljenoj html datoteci, prikazati saržaj web stranice u formi koja je određena HTML jezikom.
HTML jezik definiše pravila koja diktiraju kako se određeni delovi web stranice prikazuju
korisniku. Kao primer ovoga, navešćemo sledeća 2 HTML elementa sa njihovim pripadajućim
značenjem:
1.2.2. HTML
HTML jezik predstavlja jezik za definisanje sadržaja web-stranica, tako što se tekstualni sadržaj
koji se prikazuje korisniku proširuje HTML elementima (stručno HTML tagovi). HTML tagovi
govore web-čitaču na koji način da prikaže (iscrta, renderuje) koji deo sadržaja. HTML elementi
koje možemo da koristimo su definisani HTML standardom i sa njima se polaznici upoznaju u
sklopu prvog modula kursa. Slika 1-3 prikazuje osnovnu strukturu jednostavnog taga.
Prvo što je potrebno uočiti je da se ovde radi o HTML tagu koji se naziva h1, koji je po HTML
standardu rezervisan za glavne naslove (Header 1). Ime taga se nalazi unutar zagrada < i >
(odnosno znakova manje od i veće od) i HTML tag-ovi poseduju svoj otvarajući i zatvarajući deo
tako da se sav sadržaj između otvarajućeg i zatvarajućeg taga smatra delom tog tag-a. HTML
elementi mogu da sadrže samo tekst (kao što je slučaj sa h1 tagom sa Slika 1-3) ili druge HTML
elemente. Zatvarajući tag se razlikuje od otvarajućeg po kosoj liniji (stručno slash ili forward
slash) koja se nalazi pre imena tag-a.
Unutar otvarajućeg taga, pored imena elementa, mogu se naći HTML atributi koji dodatno
proširuju značenje određenog elementa. Jedan HTML tag može da ima 0 ili više atributa, pri
čemu su atributi koji se mogu dodati HTML elementima takođe definisani standardom. U
primeru na slici, HTML element ima jedan atribut koji se zove class, i njegova vrednost je
naslovi crveno (detaljnije upoznavanje sa HTML atributima i njihovim vrednostima je predviđeno
na prvom modulu kursa).
Primer HTML koda koji definiše web stranicu sa jednim naslovom, paragrafom teksta i linkom
kao i kako ta stranica izgleda prikazana u browseru možete videti na listingu i slici ispod.
Probajte da prepišete ovaj kod, snimite ga kao html datoteku (recimo primer.html) i otvorite u
svom browseru (duplim klikom na datoteku).
<html>
<head>
<title>HTML primer</title>
<link rel="stylesheet" href="stil.css">
</head>
<body>
<h1>Dobrodošli</h1>
<p>
HTML (енгл. Hyper Text Markup Language, језик за означавање
хипертекста) је описни језик специјално намењен опису веб страница.
Помоћу њега се једноставно могу одвојити елементи као што су наслови,
параграфи, цитати и слично. Поред тога, у HTML стандард су уграђени
елементи који детаљније описују сам документ као што су кратак опис
документа, кључне речи, подаци о аутору и слично. Ови подаци су
општепознати као мета подаци и јасно су одвојени од садржаја
документа.
Актуелна верзија стандарда је HTML 4.01, а сам стандард одржава
Конзорцијум за Веб (W3C, World Wide Web Consortium).
</p>
<a href="https://sr.wikipedia.org/wiki/HTML">Pročitajte više</a>
</body>
</html>
Fundamentalne front-end tehnologije
Dokument za polaznike 5
Front-end web development
Priručnik za pripremu
1.2.3. CSS
CSS predstavlja jezik za definisanje stila HTML elemenata. Bez CSS stilova sve HTML stranice
bi izgledale isto, odnosno HTML elementima bi stilove dodeljivali browseri. Koristeći CSS
pravila, developeri i dizajneri mogu vrlo detaljno da definišu izgled pojedinih HTML elemenata.
CSS pravila su vezana na HTML stranice, i kao takva se mogu pisati u istim datotetakama kao i
HTML kod (datoteke sa ekstenzijom .html) ili u posebnim datotekama (ekstenzija .css) kako bi
mogli jedan skup CSS pravila povezati sa više HTML datoteka. Sintaksa CSS jezika je vrlo
jednostavna i lako se uči, osnovno što treba uočiti je da se jedna CSS datoteka sastoji od skupa
CSS pravila. Primer jednostavnog CSS pravila je dat na slici.
Osnovni deo CSS pravila je selektor koji govori browseru na koje HTML elemente se pravilo
odnosi (u ovom slučaju radi se o svim HTML elementima koji imaju class atribut čija je vrednost
naslovi, bez obzira na njihov naziv). Pored selektora, unutar vitičastih zagrada, navode se CSS
izrazi koji definišu kako će HTML elementi koji su obuhvaćeni selektorom da izgledaju. CSS
izrazi se sastoje od parova ime i vrednost koji su razdvojeni dvotačkom, dok su sami izrazi
međusobno razdvojeni tačka-zarezom. Važno je napomenuti da, iako se na srpskom jeziku i za
delove CSS izraza i za HTML atribute koristi termin atributi, na engleskom se HTML atributi
nazivaju HTML attributes, dok se kod CSS koristi naziv CSS properties.
Regulatorno telo koje je zaduženo za HTML i CSS standarde je firma pod nazivom World Wide
Web Consortium (W3C). Na W3C sajtu možete pronaći detaljne specifikacije HTML i CSS
jezika, kao i vrlo dobar izvor interaktrivnih primera, na delu koji se naziva W3C schools.
Na sledećem listingu dodaćemo sledeće stilove na html primer iz prethodnog poglavlja:
• Tekst glavnog naslova obojiti u crvenu boju i centrirati horizontalno;
• Ukositi tekst u paragrafu;
• Isključiti podvlačenje teksta u linku i povećati slova na 20px.
CSS kod koji omogućava ove izmene izgleda ovako:
h1 {
color: red;
text-align: center;
}
p {
font-style: italic;
}
a {
text-decoration: none;
font-size: 20px;
}
Ukoliko ovaj kod prepišete u CSS datoteku (stil.css) i snimite je u isti folder kao i datoteku iz
HTML primera, trebalo bi da vaša stranica sada izgleda ovako:
1.2.4. JavaScript
JavaScript je programski jezik koji se izvršava od strane web-čitača u okviru web-stranica. Bez
postojanja JavaScript naredbi, HTML stranice predstavljaju samo skup formatiranog teksta koji
ostaje nepromenljiv od trenutka prikaza bez obzira na korisničke akcije nad stranicom.
JavaScript čini HTML stranice dinamičnijim tako što omogućava pristup i menjanje HTML
elemenata u toku njihovog prikazivanja korisniku.
Interaktivnost i dinamičnost HTML elemenata se postiže sledećim JavaScript mogućnostima:
1. Pristup sadržaju - JavaScript omogućava selektovanje bilo kog HTML elementa,
njihovih atributa, tekstualnog sadržaja ili podelemenata. Na primer, u mogućnosti
smo da:
a. Selektujemo HTML elemente na sličan način kao pomoću CSS jezika.
Selekcijom (odabirom) HTML elementima dobijamo kontrolu nad elementom
unutar programskog koda;
b. Saznamo šta je uneseno u određeno tekstualno polje ili koji checkbox je
selektovan od strane korisnika.
2. Modifikacija sadržaja - Koristeći JavaScript naredbe u mogućnosti smo da dodamo
nove i obrišemo ili izmenimo postojeće HTML elemente u realnom vremenu. Na
primer, JavaScript nam omogućava da:
a. Dodamo pasus teksta na željenu poziciju;
b. Promenimo ime pridružene CSS klase određenim elementima kako bi
izazvali promenu njihovog izgleda pod određenim uslovima;
c. Promenimo dimenzije i pozicije odabranih elemenata na stranici.
3. Reakcija na događaje - Možemo da napišemo određene JavaScript naredbe koje
će se izvršiti kao reakcija na određene korisničke akcije (događaje). Neki od
događaja na koje možemo da reagujemo su:
a. Klik na dugme ili link na stranici;
b. Prelazak mišem preko određenog HTML elementa;
c. Unos teksta u elemente formi;
d. Kada istekne određeno vreme;
e. Kada web-čitač završi učitavanje stranice.
JavaScript predstavlja treći (i finalni) jezik koji web-čitači razumeju, pored HTML-a i CSS-a, sve
ostale web-tehnologije i jezici su izvedeni iz ova tri. Međutim, za razliku od HTML-a i CSS-a,
jedino JavaScript spada u programske jezike i kao takav zahteva poznavanje tehnika
programiranja kako bi se adekvatno koristio. U ovom priručniku biće pokrivene osnovne teme
koje su neophodne za savladavanje tehnika programiranja u JavaScript jeziku u sklopu Front-
end development kursa koji organizuje FTN Informatika D.O.O. Novi Sad.
1.3.1. Elements
Elements (u nekim browserima se Inspector) tab u sklopu Developer tools-a služi za prikaz i
manipulaciju HTML elementima i njima pripadajućim CSS stilom. Prilikom otvaranja ovog dela,
sa leve strane se prikazuje HTML kod stranice odakle je moguće odabrati neki element
(označeno brojem 1 na slici) pri čemu se u desnom delu Developer tools-a (broj 2 na slici)
prikazuju sva CSS pravila vazana za odabrani element. U isto vreme, odabrani element se
vizuelno ističe na samoj stranici tako što se preko njega prikazuje providni sloj koji označava
gde i kako se taj element prikazuje na stranici (broj 3 na slici: plavo - sadržaj elementa,
narandžasto - padding, žuto - margina). Iz ovoga taba je moguće menjati HTML i CSS kod pri
čemu su promene vidljive direktno na otvorenoj stranici što predstavlja vrlo korisnu
funkcionalnost (bitno je napomenuti da se izmene ne čuvaju u samim HTML i CSS datotekama,
već ih je potrebno tamo uneti i snimiti datoteke kako bi ih trajno sačuvali).
Developer tools
Dokument za polaznike 9
Front-end web development
Priručnik za pripremu
HTML elemente je moguće odabrati i direktno na stranici uz pomoć Inspector alata (prva ikonica
sa leve strane u delu označenom brojem 4 na slici). Uz pomoć ovog alata, klikom na element na
samoj stranici njegov HTML i CSS kod se prikazuju u Developer Tools kao što je prikazano na
slici. Pored ovoga, ovaj deo Developer tools alata omogućava simulaciju prikaza stranice na
mobilnom uređaju. Ovo je moguće uz pomoć alata koji se nalazi pored Inspector alatke (druga
ikonica u delu označenom brojem 4 na slici). Klikom na ikonicu ovog alata, u sklopu browsera
se otvara prikaz koji simulira mobilni browser. Ovde je na brz i lak način moguće testirati kako
se naša stranica ponaša i izgleda na mobilnim uređajima. Iznad same stranice se nalaze
kontrole za biranje rezolucije ali je moguće i ručno menjati veličine prikaza pri čemu se trenutna
rezolucija prikazuje u tim kontrolama.
1.3.2. Console
Console tab predstavlja mesto u kojem možemo videti greške u našem JavaScript kodu i zbog
toga je preporuka da ovaj tab uvek imamo otvoren prilikom JavaScript programiranja. Za
potrebe demonstracije, izmenićemo JavaScript komandu document.write() tako da ona glasi:
dokument.write(). Ovo je nevalidna komanda u JavaScript jeziku (promenjena je ključna reč
document u dokument), tako da je prikazana HTML stranica prazna, a u developer konzoli se
prikazuje poruka o grešci u programu. Iz ove poruke možemo videti detaljniji opis greške i broj
linije u kojem se desila greška. Izgled konzole prilikom pojave ove greške je prikazan na slici.
Developer tools
Dokument za polaznike 10
Front-end web development
Priručnik za pripremu
Sa slike se vidi da poruka o grešci glasi “Uncaught ReferenceError: dokument is not defined” i
da je do greške došlo na liniji broj 7 u datoteci prvi.html. Pored ovoga, u Console deo je
moguće ispisivati željene vrednosti iz programa upotrebom komande console.log().
1.3.3. Sources
Sources tab prestavlja mesto na kojem možemo videti sve datoteke koje su uključene u našu
stranicu i koje nam omogućava debug-ovanje našeg JavaScript koda. Debug-ovanje je proces
traženja grešaka (ili generalne inspekcije) programskog koda pri čemu se izvršavanje programa
zaustavi na željenoj naredbi nakon čega programer može da ručno nastavi izvršavanje sledećih
naredbi po želji prateći pri tome željene vrednosti u programu.
Na slici je dat primer debug-ovanja jednostavnog programa koji sabira dva broja u JavaScriptu.
Zaustavljanje izvršavanja programa se vrši klikom na broj linije koja sadrži naradbu u kojoj
želimo da zaustavimo izvršavanje. Ovo će dodati prekidnu tačku (breakpoint) na toj liniji (broj 1
na slici prikazuje prekidnu tačku na liniji broj 4). Kako bi ponovo pokrenuli naš JavaScript
program (koji će se nakon toga zaustaviti na prvoj prekidnoj tački) potrebno je ponovo učitati
stranicu (refresh). Alatna traka, na slici označena brojem 3 omogućava kontrole putem kojih je
moguće upravljati daljem izvršavanjem programa:
1. Resume - Nastavlja normalno izvršavanje programa do sledeće prekidne tačke ili do
kraja programa.
2. Step over - Nastavlja izvršavanje do sledeće naredbe. Ovo je vrlo korisna opcija koja
omogućava izvršavanje programa liniju-po-liniju.
Developer tools
Dokument za polaznike 11
Front-end web development
Priručnik za pripremu
3. Step into/Step out - Ukoliko trenutna naredba koja se izvršava sadrži poziv neke
eksterne funkcije, ove komande omogućavaju ulazak u izvršavanje pozvane funkcije pri
čemu se debug nastavlja u kodu te funkcije.
Željene vrednsti iz našeg programa možemo pratiti u Watch delu (broj 2 na slici). Dodavanje
vrednosti koje želimo da pratimo vrši se klikom na “+” ikonicu u gornjem desnom uglu Watch
dela nakon čega je moguće uneti izraz koji želimo da pratimo. Na slici su u Watch deo dodane
promenljive a i b iz programa pri čemu se mogu videti njihove trenutne vrednosti (3 i 5).
1.3.4. Network
U ovo delu Developer tools-a je moguće videti sve zahteve koji se sa naše stranice šalju prema
serveru (označeno brojem 1 na slici). Na slici se može videti da prikazana stranica šalje 10
zahteva za dodatnim resursima (css datoteke, fontovi, slike). Klikom na neki zahtev iz liste
dobijamo detaljni prikaz podataka o tom zahtevu u desnom delu (broj 2 na slici). Između
ostalog, ovde je moguće pogledati sadržaj odgovora od servera što je vrlo korisno ukoliko se
naša aplikacija oslanja na čestu komunikaciju sa serverima.
2. Uvod u programiranje
Algoritamsko razmišljanje
Dokument za polaznike 13
Front-end web development
Priručnik za pripremu
● Grananje - Označava tačku kada se algoritam deli na više tokova izvršavanja. Tok kojim
će algoritam nastaviti svoje izvršavanje nakon koraka grananja zavisi od uslova koji je
zadat u grananju.
Sam tok izvršavanja algoritma vizualizovan je strelicama koje povezuju elemente dijagrama.
Smer strelica sugeriše smer izvršavanja algoritma (iako nije obavezno, opšti smer svih
dijagrama toka je od gore prema dole).
Primeri algoritama
Dokument za polaznike 14
Front-end web development
Priručnik za pripremu
Primeri algoritama
Dokument za polaznike 15
Front-end web development
Priručnik za pripremu
Primeri algoritama
Dokument za polaznike 17
Front-end web development
Priručnik za pripremu
Primeri algoritama
Dokument za polaznike 18
Front-end web development
Priručnik za pripremu
Primeri algoritama
Dokument za polaznike 19
Front-end web development
Priručnik za pripremu
NAPOMENE:
Ovde je bitno uočiti kako se i situacije koje se nama čine rutinske i očigledne stvari sastoje od
niza vrlo konkretnih koraka i uslova koji se moraju ispoštovati. Takođe, jedan zadatak može
imati beskonačno mnogo jednako dobrih rešenja, tako da svi prezentovani algoritmi ne
predstavljaju jedino moguće i najbolje rešenje datih zadataka.
Primeri algoritama
Dokument za polaznike 20
Front-end web development
Priručnik za pripremu
Primeri algoritama
Dokument za polaznike 21
Front-end web development
Priručnik za pripremu
Zadaci za vežbu
Dokument za polaznike 22
Front-end web development
Priručnik za pripremu
3. Programiranje u JavaScript-u
Kako bi algoritam za naš program bio validan, kompjuteri moraju da budu u stanju da razumeju i
isprate sve predviđene korake. Ovi koraci koji su namenjeni izvršavanju od strane kompjutera
se stručno nazivaju instrukcije ili naredbe i specifične su za programski jezik koji koristimo.
<!DOCTYPE html>
<html>
<head>
<title>Document</title>
<script type="text/javascript">
</script>
</head>
<body>
</body>
Slika 3-1 Struktura HTML stranice
Naredba koja ispisuje željeni tekst na HTML stranici u JavaScript jeziku glasi:
document.write(), i od nas se očekuje da u zagradama navedemo tekst koji želimo da
ispišemo. Ovu naredbu ćemo koristiti za prikaz rezultata i poruka iz programa, tako da je
možemo smatrati JavaScript implementacijom izlaznog bloka iz dijagrama toka.
S obzirom da je jedina funkcija našeg programa ispisivanje teksta na HTML stranici, on će se
sastojati samo od jedne naredbe. Kompletan sadržaj datoteke prvi.html sa programom je
prikazan na slici.
Ukoliko smo sve dobro uradili, nakon snimanja i otvaranja ove datoteke u Google Chrome-u,
prikazuje nam se bela HTML stranica sa tekstom “Dobar dan!”.
<!DOCTYPE html>
<html>
<head>
<title>Document</title>
<script type="text/javascript">
document.write("Dobar dan!");
</script>
</head>
<body>
</body>
</html>
NAPOMENE:
U prikazanom JavaScript programu potrebno je uočiti nekoliko bitnih pravila:
1. Sve JavaScript naredbe završavaju sa znakom tačka-zarez (;) iako je velika
verovatnoća da će naš program raditi i ako ovo zaboravimo, pisanje tačka-zareza je
obavezno na kraju naredbi.
2. Tekst se u programiskim jezicima piše pod znakovima navoda. U JavaScriptu je
tekstove moguće pisati i pod jednostrukim i pod dvostrukim navodnicima. Više detalja o
ovome u poglavlju u kojem se obrađuju tekstualni tipovi.
3. Prazne linije se ignorišu prilikom izvršavanja programa i koristićemo ih uglavnom sa
ciljem poboljšanja preglednosti napisanog koda.
4. Takođe, zbog čitljivosti koda, potrebno je obratiti pažnju na uvlačenje linija. Kao što se
vidi u primeru, sve naše naredbe se pišu uvučene za jedan TAB u odnosu na <script>
tab.
3.2. Komentari
Komentari predstavljaju delove programskog koda koji se ne izvršavaju već služe da detaljnije
opišu kod ili za ostavljanje beleški opšte namene. U JavaScript jeziku postoje dva tipa
komentara:
1. Jednolinijski komentari - Počinju znakovima // i završavaju se prelaskom u novi
red. Sledeća linija nije komentar osim ako ne počinje sa navedenim znakovima.
2. Višelinijski komentari - Sav tekst između znakova /* i */ se smatra delom
komentara bez obzira na nove redove.
Primeri komentara:
// Ovo je jednolinijski komentar.
/*
*/
3.3. Promenljive
Prilikom pisanja programa, vrlo često imamo potrebu da spremimo određene vrednosti koje
koristimo kako bi mogli da ih ponovo upotrebimo kada su nam potrebne. Ako pogledamo primer
algoritma za rešavanje kvadratne jednačine, koeficijente jednačine, kao i determinantu smo
označili odgovarajućim slovima i kao takve ih koristili u našem algoritmu. Ove imenovane
vrednosti se u programiranju zovu promenljive i predstavljaju jedan od fundamentalnih
koncepata programiranja.
Dakle, promenljive nam omogućavaju da vrednostima koje koristimo u našem programu
dodelimo imena i pod tim imenima ih koristimo u daljem kodu. Promenljive se u JavaScript
programu definišu navođenjem ključne reči var, nakon čega sledi ime promenljive i dodela
vrednosti. Na primer, ukoliko želimo da kreiramo promenljivu a i dodelimo joj vrednost 5,
pisaćemo sledeći kod:
var a = 5;
Dalje, kada god nam je potrebna promenljiva a, dovoljno je da pišemo samo njeno ime, bez
navođenja bilo kakvih ključnih reči. Ukoliko unapred ne znamo vrednost promenljive, moguće je
da je kreiramo bez dodele vrednosti, a kasnije po potrebi je dodelimo (na isti način možemo da
promenimo inicijalno dodeljenu vrednost).
var a;
a = 5;
Komentari
Dokument za polaznike 26
Front-end web development
Priručnik za pripremu
Promenljive
Dokument za polaznike 27
Front-end web development
Priručnik za pripremu
<!DOCTYPE html>
<html>
<head>
<title>Javascript promenljive</title>
<script type="text/javascript">
var a = 5;
var b = 3;
var c = a + b;
document.write(c);
</script>
</head>
<body>
</body>
var a = 3;
var b = 6.4;
var broj = 2;
var broj2 = a + b;
var rezultat = broj2 + 2 - a;
vrednosti true ili false. Ovo je posledica činjenice da su boolean tipovi uvedeni za
predstavljanje rezultata logičnih uslova koji mogu biti tačni ili netačni i ništa drugo (setimo se
uslova d<0 iz primera sa kvadratnom jednačinom, njegov rezultat je ili DA ili NE). Na logičke
tipove primenjujemo logičke operatore i pravila tzv. Bulove algebre o čemu će detaljnije biti reči
u sledećem poglavlju.
Primeri definisanja logičkih promenljivih:
var a = true;
var b = false;
3.4.4. null
Poseban tip za promenljive koje nemaju vrednost je tzv. nepostojeći tip ili null. Ovde je vrlo
važno naglasiti da, iako sličnost u imenu postoji, null promenljive nemaju vrednost 0, niti bilo
koju drugu vrednost. One prosto pokazuju na praznu memorijsku lokaciju i rukovanje null
vrednostima u kodu dovodi do greške u programu. Pokušaj manipulacije nepostojećim
vrednostima predstavlja jednu od najčešćih početničkih grešaka u programiranju (a i grešaka
uopšte), tako da je jako bitno od početka obraćati pažnju na izbegavanje nepostojećih vrednosti
(tako što ćemo inicijalizažovati promenljive kad god je to moguće i sl.).
3.5. Operatori
Operatori predstavljaju način kojim vršimo akcije nad varijablama (promenljivim) i vrednostima.
U prethodnim primerima videli smo upotrebu operatora + koji predstavlja sabiranje i pripada
aritmetičkim operatorima. Najvažnije grupe operatora koje ćemo opisati su operatori dodele,
aritmetički, relacioni i logički operatori.
var a = 3 + 5;
Prvo smo izračunali vrednost sa desne strane operatora = i onda smo rezultat stavili u
promenljivu koju smo naveli sa leve strane operatora. Razmotrimo još jedan slučaj:
var a = 5;
var b = a + 2;
Operatori
Dokument za polaznike 30
Front-end web development
Priručnik za pripremu
U ovom primeru prvo je dodeljena vrednost 5 promenljivoj a. Onda u sledećoj liniji je uzeta
vrednost varijable a (koja je još uvek 5), na nju je dodata vrednost 2 i na kraju je rezultat
sačuvan u promenljivu b.
Pored osnovnog operatora dodele =, postoje i: +=, -=, *=, /=, %=. Ovi operatori predstavljaju
skraćeni način zapisa kombinacije osnovnih aritmetičkih operatora i operatora dodele. Dakle,
ako je dat sledeći izraz:
var a = 5;
a = a + 3;
On bi se mogao zapisati i na sledeći način:
var a = 5;
a += 3;
Što dalje implicira da je a = a + 3, isto kao i a += 3.
U narednim tabelama su dati primeri aritmetičkih operatora i operatora dodele. Pretpostavimo
da je:
var y = 10;
Operator Rezultat
x=y+3 x = 13
x=y-2 x=8
x=y%3 x=1
x = ++y x = 11, y = 11
x = y++ x = 10, y = 11
x = --y x=9
Operatori
Dokument za polaznike 31
Front-end web development
Priručnik za pripremu
Pretpostavimo da je:
var x = 10;
var y = 5;
x=y x=5
x += y x=x+y x = 15
x -= y x=x-y x=5
x *= y x=x*y x = 50
x /= y x=x/y x=2
x %= y x=x%y x=0
Napomena: Jako je važno obratiti pažnju na prvi red u tabeli gde se koristi x = y. Ovaj izraz
predstavlja dodelu vrednosti iz promenljive y u promenljivu x. Ne predstavlja poređenje.
var x = 3;
var y = 5;
var rezultat = x == y;
U ovom primeru prvo smo preuzeli vrednost koju vraća operator ==, koja je u ovom slučaju
false i nakon toga tu vrednost upisali u promenljivu rezultat.
Primer primene operatora ===
Operatori
Dokument za polaznike 32
Front-end web development
Priručnik za pripremu
var x = 5;
var y = "5";
var rezultat = x == y;
U ovom primeru operator == vraća vrednost true, pošto promenljive x i y imaju iste vrednosti.
Međutim promenljiva y nije istog tipa kao i promenljiva x. Tu se može iskoristiti operator ===.
var x = 5;
var y = "5";
var x = 10;
Operator Rezultat
== x == 5 je netačno (false)
!= x != 5 je tačno (true)
Kao što vidimo, operator && kao rezultat vraća true, samo kad su vrednosti sa njegove leve i
desne strane true. Tabela ispod sadrži rezultate logičkog operatora || (OR).
|| false true
Dakle, za logički operator || (OR) bitno je da je vrednost sa njegove leve ili sa desne strane true,
da bi kao rezultat vratio true. Tabela ispod sadrži rezultate operatora ! (NOT).
false true
true false
Kao što vidimo, operator ! (NOT) negira vrednosti, gde od vrednosti false primenom operatora
dobijamo vrednost true i gde od vrednosti true primenim operatora dobijamo vrednost false.
Tabela ispod prikazuje primer upotrebe ovih operatora. Pretpostavimo da je:
var x = 6;
var y = 3;
|| disjunkcija (OR) x == 5 || y == 5
netačno (false)
Operatori
Dokument za polaznike 34
Front-end web development
Priručnik za pripremu
3.6.1. if-else
Formalno napisana, if-else naredba izgleda:
if (izraz)
naredba_1
else
naredba_2
U ovoj naredbi else deo nije obavezan da se napiše. Prvo se izračunava izraz, ako je tačan,
odnosno ako ima vrednost true, izvršava se naredba_1. Ako je izraz netačan (ima vrednost
false) i ako postoji else deo, izvršava se naredba_2. Ovaj tip naredbe možemo ilustrovati
sledećim primerom:
var vreme = 9;
if (vreme < 10)
console.log("Dobro jutro!");
else
console.log("Dobar dan!");
U primeru je deklarisana promenljiva vreme sa pridruženom vrednosti 9. U if delu naredbe
proverili smo da li je izraz vreme < 9 tačan. Pošto je to tačno, odnosno true, izvršeno je
ispisivanje poruke “Dobro jutro”. Treba obratiti pažnju na pomenuto, a to je da else deo nije
obavezan. Ukoliko je to potrebno primer možemo modifikovati tako da ima samo if deo i samo
da ispisuje “Dobro jutro”, ukoliko je vreme < 10. U tom slučaju primer izgleda:
var vreme = 9;
if (vreme < 10)
console.log("Dobro jutro!");
Svaka naredba može biti predstavljena algoritmima dijagrama toka. Na njima se jasno vidi put
koji je odabran u zavisnosti od uslova u if-else naredbi. Na slici 3.1. kojom je opisan prethodni
primer, uočava se da je odabrana desna grana za nastavak izvršavanja programa zbog toga što
je rezultat izraza vreme < 10 tačan, odnosno true.
Ukoliko hoćemo da proširimo if-else naredbu, tako više naredbi bude izvršeno ukoliko je izraz
tačan koristimo vitičaste zagrade { i }. Vitičaste zagrade se koriste za grupisanje naredbi i
deklaracija u jednu celinu, odnosno blok. Prethodni primer modifikovan tako da koristi { i }.
var vreme = 9;
if (vreme < 10) {
console.log("Dobro jutro!");
console.log("Poranili ste!");
} else {
console.log("Dobar dan!");
console.log("Poslovi su uveliko u toku!");
}
Ovaj prošireni primer koristi dve naredbe u okviru jednog bloka. Sve od otvaranja bloka sa { pa
do njegovog zatvaranja sa } , smatra se delom jedne celine.
3.6.2. else-if
Formalno napisana, else-if naredba izgleda:
if (izraz_1)
naredba_1
else if (izraz_2)
naredba_2
else if (izraz_3)
naredba_3
else
naredba_4
Ovu naredbu možemo posmatrati kao if-else naredbu, sa dodatnim else-if naredbama. Ova
naredba u suštini predstavlja niz naredbi koji je najopštiji način za pisanje odluka sa više grana.
Izrazi u naredbama se izvršavaju po redosledu, tako da ako je neki izraz tačan, izvršava se
njegova pridružena naredba. Npr. ako je tačan izraz_2 izvršiće se naredba_2. Nakon što se
jedna naredba izvrši uslovi se više ne proveravaju, odnosno grane su međusobno isključive.
Kao i u prethodnom primeru možemo proširiti naredbe blokovima, odnosno sa { i }. Poslednji
deo else se odnosi na podrazumevani slučaj ukoliko nijedan od prethodnih uslova nije ispunjen.
Kao i kod if-else naredbe, else deo nije obavezan da se napiše.
3.6.3. switch
Naredba switch predstavlja odluku sa više grana, koja provera da li je neki izraz jednak jednoj
od više ponuđenih vrednosti i na osnovu toga bira tok daljeg izvršenja. Formalno napisana
switch naredba izgleda:
switch (izraz) {
case vrednost_1: naredbe_1
case vrednost_2: naredbe_2
default: naredbe
}
Svaki slučaj određen je konstantnom vrednosti. Ako neki slučaj odgovara vrednosti izraza,
izvršavanje počinje od tog slučaja. Svi slučajevi u switchu moraju biti različiti. Ukoliko nijedan od
drugih slučajeva nije zadovoljen, izvršava se slučaj default.
U svakom slučaju se može nalaziti naredba break i ona izaziva izlaz iz naredbe switch. Ukoliko
u slučaju nije napisana naredba break, izvršavanje se nastavlja na sledećem slučaju. Što znači
da naredba break služi kao eksplicitna akcija za izlaz iz naredbe switch.
var ocena = 3;
switch (ocena) {
case 1:
console.log("Nedovoljan");
break;
case 2:
console.log("Dovoljan");
break;
case 3:
console.log("Dobar");
break;
case 4:
console.log("Vrlo dobar");
break;
case 5:
console.log("Odličan");
break;
default:
console.log("Ocena je van opsega!");
}
U primeru je data promenljiva ocena kojoj je pridružena vrednost 3. Switch naredba treba da na
osnovu ocene, ispiše odgovarajuću poruku. Pošto je ocena 3, izvršava se case 3 i ispisuje se
“Dobar”. Pošto naredba sadrži i break, to znači da se neposredno nakon ispisa poruke izlazi iz
naredbe switch.
3.6.4. while
While predstavlja petlju, odnosno cikličnu strukturu kod koje se zna samo uslov za prekid. Telo
ciklusa ne mora da se izvrši ni jednom. Opšta sintaksa je:
while (uslov)
telo
Prvo se proverava uslov, ukoliko je on true, izvršava se telo petlje i zatim se ponovo proverava
uslov. Izlaz iz petlje je kada uslov postane false, onda se izvršavanje nastavlja posle tela petlje.
Dat je primer while petlje:
var i = 0;
while (i < 5) {
console.log("Vrednost je: " + i);
i++;
}
U nastavku je dat primer izvršavanja:
Vrednost je: 0
Vrednost je: 1
Vrednost je: 2
Vrednost je: 3
Vrednost je: 4
U ovom primeru promenljivoj i dodeljena je vrednost 0. Nakon toga, proveren je uslov u while
petlji. Pošto je on tačan, odnosno i < 5 je true, ulazi se u telo petlje. U telu petlje je izvršen
jednostavan ispis trenutne vrednosti promenljive i njena vrednost je uvećana za 1. Promena
vrednosti promenljive koja se nalazi u uslovu je jako bitan, jer da vrednost promenljive nije
povećana u sledećem ciklusu petlje ona bi i dalje bila 0. Time bismo dobili takozvanu
beskonačnu petlju, u kojoj bi se program “zaglavio” i koja bi se izvršavala sve dok ne dođe do
nasilnog prekida programa.
3.6.5. for
For predstavlja naredbu za organizaciju petlji, kod kojih se unapred zna koliko će se puta izvršiti
telo ciklusa. For petlja se zadaje sa početnom vrednošću, uslovom za kraj i blokom za korekciju.
Zbog toga for petlje se često koriste kolekcijama podataka (npr. niz) za koje se tačno zna koliko
ima elemenata, dok se while koristi npr. za čitanje sadržaja tekstualnih fajlova liniju po liniju dok
se ne pročita čitav sadržaj. Opšta sintaksa je:
for (inicijalizacija; uslov; korekcija)
telo
Dat je primer for petlje:
for petlje, odnosno na kraju svakog ciklusa vrednost promenljive i se uvećava za 1. Bitno je
naglasiti da se u prvom ciklusu vrši inicijalizacija i provera uslova, dok se u svim ostalim vrše
korekcija i provera uslova respektivno.
U ovom primeru, for petlja se izvršava svih pet puta i u konzolu se ispisuje:
Vrednost je: 1
Vrednost je: 2
Vrednost je: 4
Vrednost je: 5
Prilikom treće iteracije, kad promenljiva i dobije vrednost 3, izvršava se if i u njemu naredba
continue, koja izaziva početak naredne iteracije for petlje. Za više informacija pogledajte You
Don’t Know JS (https://github.com/getify/You-Dont-Know-JS), Up & Going, Chapter 2: Into
JavaScript.
3.6.7. Nizovi
U JavaScriptu niz predstavlja kolekciju koja sadrži elemente bilo kog tipa. Vrednosti u nizu
nemaju nikakav poseban naziv, nego im se pristupa na osnovu indeksa. Niz definišemo putem
uglastih zagrada, [ i ]. Dakle prazan niz definišemo na sledeći način.
niz[1] = "mercedes";
Na ovaj način pristupljeno je nizu na indeksu 1 i upisana je nova vrednost. Tako da sada niz
izgleda [“saab”, “mercedes”, “bmw”].
Napomena: Da bi pristupili bilo kom nizu, potrebno je prvo navesti ime promenljive i onda
neposredno nakon toga uglaste zagrade koje sadrže odgovarajući indeks. U dosadašnjim
primerima to je niz[indeks].
Na početku je pomenuto da su nizovi objekti, odnosno specijalni tipovi objekata u javascriptu.
To otvara mogućnost da nizovi imaju atribute i metode. Odnosno obeležja i funkcije koje
pomažu pri samom radu sa nizovima. Funkcije su detaljno opisane u sledećem poglavlju, za
potrebe ovog poglavlja pokazaćemo kako se koriste one bitne za nizove.
Svaki niz poseduje atribut length. Length je atribut koji sadrži vrednost o tome koliko elemenata
ima taj niz. Atribut se navodi na sledeći način:
Niz ima 3 elementa, zbog toga će uslov u for petlji biti i < 3. Rečeno je da indeksiranje ide od 0,
što implicira da se u prvoj iteraciji for petlje izvršava naredba: var auto = niz[0], pošto smo
objasnili da indeksiranje ide od 0 i način na koji se preuzimaju vrednosti iz niza, dolazimo do
zaključka da auto sadrži vrednost saab. For petlja se izvršava još dva puta, za indekse 1 i 2,
odnosno promenljiva auto imaće vrednosti audi i bmw.
Dodavanje elemenata u niz se radi pomoću metode push(). Pozivanje je slično kao kod metode
console.log(), međutim metoda push() se poziva za nizove. Dodavanje se radi na sledeći način.
Rezultat izvršavanja koji je ispisan u konzoli nakon dodavanja elementa prikazan je na sledeći
način:
apple
samsung
huawei
xiaomi
Kontrola toka i petlje
Dokument za polaznike 42
Front-end web development
Priručnik za pripremu
Često je potrebno ukloniti, odnosno izbrisati element iz niza. Ukoliko je potrebno obrisati
poslednji element u nizu, moguće je iskoristiti funkciju pop().
telefoni.splice(1, 2);
Pored ovog načina, postoji još jedan način za pristup elementima u dvodimenzionalnim
nizovima koji se koristi češće. Pristup, koji pomenut u prethodnim primerima je odličan za
razumevanje dvodimenzionalnih nizova, međutim sa dosta manje koda moguće je postići istu
efikasnost. Recimo ukoliko prethodni primer želimo da rešimo efikasnije, to možemo uraditi na
sledeći način:
var matrica = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
];
Razlog je tome što matrica[i], bez obzira koja je vrednost i u tom trenutku ima 4 elementa i to su
0, 1, 2, i 3. Ispisivanje elemenata matrice se vrši na već opisani način, međutim umesto fiksnih
vrednosti koje su do sada navođenje, ispisivanje se radi sa promenljivim vrednostima i, j.
Ispisivanje elemenata matrice se odvija redovima, odnosno spoljašnja for petlja se izvršava
jednom, pa se onda unutrašnja for petlja izvrši još 4 puta. U nastavku dat je primer izvršavanja
for petlje za vrednost i, j.
i = 0, j = 0
i = 0, j = 1
i = 0, j = 2
i = 0, j = 3
Dakle u primeru su opisane vrednosti indeksa i,j za jednu iteraciju spoljašnje for petlje.
Vrednosti za zadate indekse su 1, 2, 3, 4, odnosno matrica[0][0], matrica[0][1], matrica[0][2],
matrica[0][3]. Izvršavanje se nastavlja i za preostala dva reda.
i = 1, j = 0
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 0
i = 2, j = 1
i = 2, j = 2
i = 2, j = 3
Zadatak: Odrediti vrednosti matrice za prikazane indekse.
3.6.9. Zadaci
ZADATAK 3.6.1
Napisati program koji ispisuje poruku u zavisnosti od doba dana. Ukoliko je vreme manje od 10
potrebno je ispisati “Dobro jutro”, ukoliko je vreme manje od 18 ispisati “Dobar dan”, za sve
ostale slučajeve ispisati dobro veče.
ANALIZA:
Za potrebe rešavanja ovog zadatka možemo iskoristiti i proširiti primer koji dat u sekciji 3.6.1.
Kao ulazni podatak neophodno je definisati promenljivu koju ćemo nazvati vreme kojoj će biti
pridružena neka vrednost. Na osnovu te vrednosti su napisani izrazi u if-else naredbi. Na
osnovu datih informacija, možemo skicirati blok dijagram koji je dat na slici.
Dakle na primeru se vidi, da je prvo zadata vrednost za promenljivu vreme. Nakon toga je
izvršena provera da li je vreme < 10, u slučaju da jeste program bi odabrao prvu True granu i
ispisao bi “Dobro jutro”. Pošto to nije slučaj, ide se False granom za prvu proveru i dolazi se do
druge provere. Ova provera se izvršava tako što se postavlja uslov da li je vreme < 20. Pošto
jeste, odabira se True grana i ispisuje se “Dobar dan”. Bitno je napomenuti da je vreme
inicijalno dobilo neku vrednost koja je veća od 20, program bi odabrao poslednju False granu i
ispisao “Dobro veče”. Sada preostaje da se opisani algoritam implementira u Javascript kodu.
ZADATAK 3.6.2
Napisati program koji vrši konverziju iz Celzijusa u Farenhajte za svakih 10 stepeni od 0 do 100
stepeni Celzijusa. Formula za konverziju: C * 9/5 + 32 = F
ANALIZA:
Algoritam nam se nameće postavkom zadatka. Uočavamo da je data formula za konverziju, kao
i to da se konverzija izvršava više puta. Pored toga dat je i korak izvršavanja, koji traži da se
konverzija vrši za svakih 10 stepeni. Blok dijagram za ovaj zadatak je prikazan na slici.
Promenljivoj i je pridružena vrednost 0, kao što je traženo u zadatku. Nakon toga je izvršena
provera uslova da li je vrednost promenljive i <= 100, ukoliko je to tačno vršimo konverziju.
Prilikom vršenja konverzije vrednost pridružena promenljivoj i nam ujedno predstavlja i vrednost
temperature u Celzijusima. Nakon konverzije i ispisivanja, vrednost promenljiva i uvećana je za
10, nakon čega se proverava uslov. Ovaj blok dijagram algoritma opisuje cikličnu strukturu, koju
možemo predstaviti for ili while petljom. Dat je primer implementacije za obe petlje.
// Primer for
for (var i = 0; i <= 100; i += 10) {
var f = i * 9 / 5 + 32;
console.log("F je: " + f);
}
// Primer while
//
var Primer
i = 0; while
var
whilei (i
= 0;
<= 100) {
whilevar(if <=
= i100)
* 9 /{ 5 + 32;
var f = i * 9 je:
console.log("F / 5 "+ +32;
f);
iconsole.log("F
+= 10; je: " + f);
} i += 10;
}
ZADATAK 3.6.3
Napisati program koji obračunava zaradu radnika. Radnici koji rade više od 40 sati nedeljno su
plaćeni 1.5 puta više nego sto bi bili plaćeni da rade do 40 sati nedeljno. Broj radnih sati je
evidentiran u nizu po danima, a cena radnog sata iznosi 1000 za svakog radnika.
ANALIZA:
Za rešavanje ovog zadatka potrebno je izračunati koliko je radnik radio u toku radne nedelje i na
osnovu toga odredi ukupnu zaradu radnika. Za računanje ukupnog broja sati rada potrebno je
sa for petljom proći kroz niz koji sadrži broj sati rada po danima i sabrati ih. Nakon toga se
donosi odluka o tome koliko je radnik plaćen, odnosno provereno je da li ima više od 40 sati
rada nedeljno. Ovaj zadatak je predstavljen blok dijagramom na sledeći način:
Blok dijagram sadrži dve promenljive radna_nedelja i radni_sat koje su promenljive i zavise od
osobe za koju se računa plata. Naredne tri promenljive koje su navedene služe za izvršavanje
algoritma i uvek se inicijalizuju na nulu. Prvi uslov služi da izračuna ukupan broj sati koje radnik
radio, a drugi uslov određuje da li je potrebno pomnožiti ukupno zaradu sa 1.5 ili ne. Ostaje još
implementacija u JavaScriptu.
var ukupnoSati = 0;
var ukupnaZarada = 0;
for (var i = 0; i < radna_nedelja.length; i++) {
ukupnoSati += radna_nedelja[i];
}
if (ukupnoSati > 40) {
ukupnaZarada = ukupnoSati * radniSat * 1.5;
} else {
ukupnaZarada = ukupnoSati * radniSat;
}
console.log(ime + " " + " ima platu od " + ukupnaZarada);
ZADATAK 3.6.4
U dvodimenzionalnom nizu dati su podaci o određenim automobilima. Potrebno je izvršiti
iteraciju kroz zadati niz i ispisati podatke o svakom automobilu.
var automobili = [
["Naziv: Mazda 6", "Kubikaza: 1998", "Godiste: 2015"],
["Naziv: Ford Mondeo", "Kubikaza: 1997", "Godiste: 2011"],
["Naziv: Peugeot 207", "Kubikaza: 1398", "Godiste: 2007"]
];
ANALIZA:
Iz date strukture možemo da uočimo, da svaki red predstavlja informaciju o jednom automobilu.
Na osnovu toga dovoljno je da sa for petljom izvršimo iteraciju kroz niz automobila i da ispišemo
podatke o svakom od njih. Ono što uočavamo je da svaka kolona predstavlja novi podatak.
Rezultat:
Naziv: Mazda 6
Kubikaza: 1998
Godiste: 2015
------------------
Kubikaza: 1997
Godiste: 2011
------------------
Kubikaza: 1398
Godiste: 2007
------------------
ZADATAK 3.6.5
Data je matrica m, potrebno je sabrati sve vrednosti matrice i na kraju ispisati rezultat sabiranja.
var m = [
[1, 2, 3, 0],
[4, 0, 5, 6],
[0, 7, 5, 9],
[3, 5, 7, 3]
];
ANALIZA:
Rešenje ovog zadatka je jako slično rešenju ostalih zadataka sa matricama koji su urađeni.
Potrebno je izvršiti iteraciju kroz zadatu matricu sa dve for petlje. Međutim pošto se u zadatku
traži da se sabere rezultat izvršavanja potrebno je definisati još jednu promenljivu rezultat sa
pridruženom vrednošću 0. Ta promenljiva je iskorišćena za skladištenje svih ostalih vrednosti iz
matrice.
var rezultat = 0;
for (i = 0; i < m.length; i++) {
for (j = 0; j < m[i].length; j++) {
rezultat += m[i][j];
}
}
3.7. Funkcije
Funkcije predstavljaju skupove naredbi koje zajedno obavljaju određeni zadatak, odnosno ideja
je da se podele veliki zadaci u manje celine i da omoguće programerima da iskoriste ono što su
drugi već uradili umesto da kreću od početka. Određene funkcije, takođe skrivaju detalje
implementacije time čineći program jasnijim i jednostavnijim za menjanje. Npr. za funkciju
console.log(), ne znamo detalje njene implementacije, međutim znamo kako da je koristimo i šta
treba da bude rezultat njenog izvršavanja. JavaScript programi se obično sastoje od mnogo
malih funkcija, koje su organizovane u .js fajlovima. Organizovanjem programa u funkcije
sprečava ponavljanje delova istog koda i čini programe čitljivijim i lakšim za održavanje.
Svaka funkcija je jednoznačno određena putem njenog imena, putem kojeg se vrši njeno
pozivanje. Pozivanjem funkcije se izvršavaju sve naredbe definisane u telu funkcije. Opšta
definicija funkcije je prikazana u sledećem primeru:
function imeFunkcije() {
// Telo funkcije
}
Funkcija u JavaScriptu obavezno počinje sa function pa zatim sledi konkretni naziv funkcije
odvojen razmakom od prethodne reči (function). Naziv, odnosno ime funkcije mora biti
jedinstveno unutar važenja funkcije (datoteka ili objekat), mora počinjati slovom i ne sme
sadržati razmake. Telo funkcije počinje i završava se sa vitičastim zagradama { i }. U telu
JavaScript funkcije moguće je definisati dodatne promenljive koje su lokalne za tu funkciju
(njihov “životni vek” je od početka do kraja funkcije), moguće je pozvati neku drugu funkciju, a
takođe je moguće i definisati neku drugu funkciju u telu JavaScript funkcije.
U nastavku je dat primer definicije i pozivanja JavaScript funkcije. Dakle da bi neka funkcija bila
izvršena, potrebno je prvo definisati (opisati šta ta funkcija radi) i nakon toga je pozvati, odnosno
izvršiti.
function pozdrav() {
console.log("Pozdrav iz JavaScripta!");
}
pozdrav();
U prethodnom primeru definisana je funkcija pozdrav, koja ima jednu naredbu a to je ispisivanje
teksta “Pozdrav iz JavaScripta” u konzolu. Funkcija se izvršava tek kada je pozovemo sa
pozdrav().
Funkcije mogu imati proizvoljan broj parametara. Parametri predstavljaju dodatne informacije
koji su potrebni funkciji da obavi svoj zadatak. Parametri se navode između malih zagrada ( i ).
Parametri su lokalne promenljive za tu funkciju, odnosno važe od početka do kraja funkcije i oni
predstavljaju ulazne informacije. Parametri dobijaju vrednosti prilikom pozivanja funkcije, kada
se prosleđuju konkretne vrednosti. Prethodni primer proširen je tako da sada uključuje
parametre.
Funkcije
Dokument za polaznike 52
Front-end web development
Priručnik za pripremu
pozdrav("Jovo", "Jovic");
Funkcije
Dokument za polaznike 53
Front-end web development
Priručnik za pripremu
var ukupno = 0;
if (brzina > 120) {
ukupno += 10000;
}
ukupno += fiksno + dodatno;
Funkcije
Dokument za polaznike 54
Front-end web development
Priručnik za pripremu
Provera funkcije je izvršena tako što smo je izvršili sa različitim vrednostima argumenata. U
prvom slučaju, pošto je brzina manja od ograničenja funkcija ispisuje Sve je u redu, prilikom
drugog poziva dat je primer gde je prekoračena brzina, međutim prekoračenje nije preko
120km/h i u trećem slučaju prekoračenje je preko 120 km/h. Kompletan urađen primer dat je na
slici u nastavku.
ZADATAK 3.7.2
Modifikovati zadatak 3.6.3. tako da koristi funkcije. Potrebno je napraviti funkciju koja kao
parametar prima ime radnika, cenu radnog sata i broj radnih sati u nedelji kao i funkciju koja
sabira broj sati u nedelji.
Originalni tekst zadatka 3.6.3:
Funkcije
Dokument za polaznike 55
Front-end web development
Priručnik za pripremu
Napisati program koji obračunava zaradu radnika. Radnici koji rade više od 40 sati nedeljno su
plaćeni 1.5 puta više nego sto bi bili plaćeni da rade do 40 sati nedeljno. Broj radnih sati je
evidentiran u nizu po danima, a cena radnog sata iznosi 1000 za svakog radnika.
ANALIZA:
U zadatku 3.6.3. lako je uočiti odvojene celine, koje su pogodne za podelu u funkcije. Prva
funkcija koja treba da se izdvoji je ona za računanje ukupnog broja sati nedeljno, dok druga
treba da primi vrednosti navedene u tekstu samog zadatka, kao i da pozove prvu funkciju u cilju
računanja broja sati. Prvu funkciju nazivamo izracunajUkupanBrojSati, a drugu nazivamo
obracunajZaraduRadnika.
function izracunajUkupanBrojSati(param1) {
var ukupnoSati = 0;
for (var i = 0; i < param1.length; i++) {
ukupnoSati += param1[i];
}
return ukupnoSati;
}
JavaScript nema posebnu sintaksu kojom označavamo tip parametra u funkciji, međutim
prilikom pozivanja funkcije znamo tip argumenta koji ćemo proslediti istoj, a to je niz. Dakle
param1 je niz, obratiti pažnju i na to da je naziv promenljive proizvoljan, kao što je ranije i
pomenuto. Pogrešno je shvatanje da naziv parametra, mora biti isti kao i naziv argumenta
prilikom pozivanja funkcije, zbog toga se u ovom primeru koristi drugačiji naziv.
Kao što je traženo u zadatku funkcija obracunajZaraduRadnika ima tri parametra ime, radniSat i
radnaNedelja. Ono što je posebno interesantno je parametar radnaNedelja, koji se već u prvom
redu funkcije obracunajZaraduRadnika, prosleđuje funkciji izracunajUkupanBrojSati. Dakle,
parametar param1 u funkciji izracunajUkupanBrojSati, je zapravo radnaNedelja, jer je upravo on
prosleđen prilikom pozivanja te funkcije. Daljom analizom koda uočavamo da je u promenljivoj
ukupnoSati, smeštena povratna vrednost funkcije izracunajUkupanBrojSati. Ta promenljiva se
dalje koristi da se proveri broj sati i dalja zarada na osnovu toga. Na kraju funkcije ispisan je
rezultat njenog izvršavanja. Jedini deo koji je preostao je primer pozivanja funkcije, koji je dat u
nastavku.
Funkcije
Dokument za polaznike 56
Front-end web development
Priručnik za pripremu
ZADATAK 3.7.3
Napisati funkciju koja prima dva parametra, prvi parametar treba da bude matrica, dok drugi
treba da ima boolean vrednost true ili false. Funkcija u zavisnosti od drugog parametra vrši
različite operacije. Odnosno ako je drugi parametar true, funkcija treba da odredi zbir elemenata
matrice, a ukoliko je njegova vrednost false treba da odredi ukupan broj nula u matrici.
Funkcije
Dokument za polaznike 57
Front-end web development
Priručnik za pripremu
ANALIZA:
Iz zadatka možemo da odredimo kako naša funkcija treba da izgleda i da treba da radi dve
različite operacije. Na osnovu toga možemo da krenemo sa implementacijom funkcije.
function odrediZbirElemenata(m) {
var zbirElemenata = 0;
for (var i = 0; i < m.length; i++) {
for (var j = 0; j < m[i].length; j++) {
zbirElemenata += m[i][j];
}
}
return zbirElemenata;
}
Funkcija odrediZbirElemenata je napisana tako da ima jedan parametar m, matricu čiji elementi
treba da se saberu. Definisana je promenljiva zbirElemenata koja treba da sadrži zbir svih
Funkcije
Dokument za polaznike 58
Front-end web development
Priručnik za pripremu
elemenata matrice i koja je ujedno i povratna vrednost funkcije. Napisane su dve for petlje koje
prolaze kroz matricu i dodaju vrednost tekućeg elementa m[i][j] na promenljivu zbir elemenata.
Sledeću funkciju nazivamo odrediUkupanBrojNula.
function odrediUkupanBrojNula(m) {
var brNula = 0;
for (var i = 0; i < m.length; i++) {
for (j = 0; j < m[i].length; j++) {
if (m[i][j] == 0) {
brNula++;
}
}
}
return brNula;
}
Funkcija srediMatricu, ostaje sa dva parametra kao na početku, međutim sama funkcija je
pretrpela značajne izmene. Koristi se promenljiva rezultat koja sadrži rezultat izvršavanja neke
od funkcija. Funkcija je zadržala proveru ako je izraz == true, poziva se funkcija
odrediZbirElemenata, u suprotnom pozvana je funkcija odrediUkupanBrojNula. Povratne
vrednosti obe funkcije se upisuju u promenljivu rezultat koji se na kraju funkcije ispisuje. U
nastavku je dat primer pozivanja funkcije, sa matricom matrix i vrednostima true i false.
Funkcije
Dokument za polaznike 59
Front-end web development
Priručnik za pripremu
var matrix = [
[1, 2, 3, 0],
[4, 0, 5, 6],
[0, 7, 5, 9],
[3, 5, 7, 3]
];
srediMatricu(matrix, true);
Rezultat izvrsavanja: Rezultat je 60
srediMatricu(matrix, false);
Rezultat izvrsavanja: Rezultat je 3
Funkcije
Dokument za polaznike 60
Front-end web development
Priručnik za pripremu
Funkcije
Dokument za polaznike 61
Front-end web development
Priručnik za pripremu
3.8. Objekti
U objektno-orijentisanom programiranju (OOP), objektima su predstavljeni pojave i entiteti iz
sistema koji programiramo. U JavaScriptu, objekti se definišu kao promenljive var, ali za razliku
od promenljivih, objekti sadrže druge promenljive i funkcije. Promenljive sadržane u objektu
nazvaćemo atributima objekta, dok ćemo funkcije sadržane u objektu nazivati metodama
objekta. Za razliku od nizova, objekte definišemo između vitičastih zagrada { i }. Objekat se
sastoji od liste parova atribut-vrednost, razdvojenih dvotačkom, a parovi se međusobno
razdvajaju zarezima.
var obj2 = {
ime: "Pera",
prezime: "Peric"
}
U datim primerima obj1 je prazan objekat, odnosno objekat koji nema atribute, dok je obj2
objekat koji ima dva atributa ime i prezime, sa vrednostima Pera i Peric.
Vrednostima atributa u objektima se pristupa na osnovu njihovih naziva. Dakle, ukoliko hoćemo
da dobijemo vrednost imena, potrebno je navesti obj2.ime, odnosno naziv objekta- tačka-atribut.
U nastavku je dat primer pristupa atributima objekta, preuzimanju njihovih vrednosti i njihovo
ispisivanje u konzolu.
var obj2 = {
ime: "Pera",
prezime: "Peric"
}
var x = obj2.ime;
console.log(x);
Rezultat: Pera
var y = obj2.prezime;
console.log(y);
Rezultat: Peric
obj2.ime = "Marko";
Vrednost atributa ime, u postojećem objektu promeniće vrednost u Marko. Iz navedenog
izvodimo zaključak da se atributi objekta ponašaju kao promenljive, odnosno u njih možemo
upisivati i čitati vrednosti.
Objekti
Dokument za polaznike 62
Front-end web development
Priručnik za pripremu
Metode, kao i atribute takođe navodimo u objektu. Recimo da je potrebno napraviti metodu da
se osoba, na osnovu njenog imena i prezimena predstavi. To je moguće rešiti na sledeći način:
var obj2 = {
ime: "Pera",
prezime: "Peric",
predstaviSe: function () {
console.log("Ja sam " + this.ime + " " + this.prezime);
}
}
Obj2 je proširen metodom predstaviSe, definicija metode je slična definiciji funkcije, međutim
potrebno je prvo navesti naziv metode-dvotačka-function(), gde je u malim zagradama moguće
navesti parametre. U metodi predstaviSe pojavljuje se nova konstrukcija i to je this. U
javascriptu this može imati različite vrednosti u zavisnosti od konteksta gde se koristi, međutim
u metodama this se odnosni na “vlasnika” metode, odnosno objekat. U našem primeru this
predstavlja objekat obj2. Što dalje implicira da this.ime, je isto kao da smo napisali obj2.ime, čija
je vrednost “Pera”.
Pozivanje metoda se vrši preko njihovog naziva, međutim potrebno je prvo navesti naziv
objekta. Nakon izvršenja u konzolu se ispisuje: “Ja sam Pera Peric”.
obj2.predstaviSe();
Rezultat: Ja sam Pera Peric
Recimo da je potrebno proširiti obj2 dodatnom metodom, omiljeniSport. Metoda ima jedan
parametar koji je naziv sporta i koja treba da u konzolu ispiše Moj omiljeni sport je X, gde je X
vrednost parametra koji je prosleđen.
var obj2 = {
ime: "Pera",
prezime: "Peric",
predstaviSe: function() {
console.log("Ja sam " + this.ime + " " + this.prezime);
},
omiljeniSport: function(nazivSporta) {
console.log("Moj omiljeni sport je " + nazivSporta);
}
}
U datom primeru, obj2 je proširen dodatnom metodom omiljeniSport. U metodi, kao i u
funkcijama parametar predstavlja promenljivu lokalnu za tu funkciju. U nastavku dat je primer
pozivanja nove funkcije.
obj2.omiljeniSport("Fudbal");
Rezultat: Moj omiljeni sport je Fudbal
Objekti
Dokument za polaznike 63
Front-end web development
Priručnik za pripremu
ZADATAK 3.8.1
Promeniti prethodni primer tako da, se prilikom poziva metode omiljeniSport, pre izvršavanja te
metode, izvrši metoda predstaviSe.
ANALIZA:
Za rešavanje ovog zadatka, potrebno je napraviti modifikaciju već postojećeg objekta, odnosno
u telu metode omiljeniSport, potrebo je prvo pozvati metodu predstaviSe.
var obj2 = {
ime: "Pera",
prezime: "Peric",
predstaviSe: function () {
console.log("Ja sam " + this.ime + " " + this.prezime);
},
omiljeniSport: function (nazivSporta) {
this.predstaviSe();
console.log("Moj omiljeni sport je " + nazivSporta);
}
}
obj2.omiljeniSport("Fudbal")
Rezultat: Ja sam Pera Peric
Moj omiljeni sport je Fudbal
Obratiti pažnju, da je metoda predstaviSe pozvana sa ključnom reči this. Zašto je potrebno
navesti this, probati primer i videti rezultat izvršavanja bez upotrebe this.
Do sada su dati primeri nizova sa brojevima ili stringovima, međutim nizovi u JavaScriptu mogu
da sadrže i objekte. Objektima u nizu, kao i ostalim vrednostima se pristupa putem indeksa. U
nastavku je dat niz osoba, za koji je potrebno za svaku osobu pozvati metodu predstaviSe.
Objekti
Dokument za polaznike 64
Front-end web development
Priručnik za pripremu
var osobe = [
{
ime: "Pera",
prezime: "Peric",
predstaviSe: function () {
console.log("Ja sam " + this.ime + " " + this.prezime);
},
omiljeniSport: function (nazivSporta) {
this.predstaviSe();
console.log("Moj omiljeni sport je " + nazivSporta);
}
},
{
ime: "Marko",
prezime: "Markovic",
predstaviSe: function () {
console.log("Ja sam " + this.ime + " " + this.prezime);
},
omiljeniSport: function (nazivSporta) {
this.predstaviSe();
console.log("Moj omiljeni sport je " + nazivSporta);
}
}];
Objekti
Dokument za polaznike 65
Front-end web development
Priručnik za pripremu
ZADATAK 3.8.2
Objekat automobil je zadat na sledeći način:
var automobil = {
model: "6",
proizvodjac: "Mazda",
kubikaza: 1998,
kilovata: 100,
godiste: 2015,
kilometraza: 134000
}
Za zadati objekat, dodati metodu koja računa koliko konjskih snaga ima automobil, dobija se
tako što se broj kilovata pomnoži sa 1.34. Dodati metodu koja povećava broj kilometara na
osnovu vrednosti prosleđenog parametra.
ANALIZA:
Prvo je potrebno dodati metodu za računanje konjskih snaga, koja je nazvana izracunajHP.
var automobil = {
model: "6",
proizvodjac: "Mazda",
kubikaza: 1998,
kilovata: 100,
godiste: 2015,
kilometraza: 134000,
izracunajHP: function () {
return this.kilovata * 1.34;
}
}
Metoda izracunajHP koristi atribut kilovata, kome se pristupa sa this.kilovata. Kao povratnu
vrednost ima ukupan broj kilovata pomnožen sa konstantnom vrednošću 1.34. Potrebno je
dodati još jednu metodu, koja je nazvana povecajBrKilometara koja ima jedan parametar. Pošto
metoda treba da izmeni atribut objekta na osnovu prosleđene vrednosti, potrebno je pristupiti
postojećem atributu i upisati novu vrednost. To se može uraditi na sledeći način:
Objekti
Dokument za polaznike 66
Front-end web development
Priručnik za pripremu
var automobil = {
model: "6",
proizvodjac: "Mazda",
kubikaza: 1998,
kilovata: 100,
godiste: 2015,
kilometraza: 134000,
izracunajHP: function () {
return this.kilovata * 1.34;
},
povecajBrKilometara: function (vrednost) {
this.kilometraza = this.kilometraza + vrednost;
}
}
automobil.povecajBrKilometara(6000);
console.log(automobil.kilometraza);
Rezultat: 140000
Kompletan urađen primer dat je u nastavku:
Objekti
Dokument za polaznike 67
Front-end web development
Priručnik za pripremu
ZADATAK 3.8.3
Niz automobila je zadat na sledeći način:
var automobili = [
{
model: "6",
proizvodjac: "Mazda",
kubikaza: 1998,
kilovata: 100,
godiste: 2015,
kilometraza: 134000
},
{
model: "Mondeo",
proizvodjac: "Ford",
kubikaza: 1997,
kilovata: 96,
godiste: 2011,
kilometraza: 166000
},
{
model: "207",
proizvodjac: "Peugeot",
kubikaza: 1398,
kilovata: 50,
godiste: 2007,
kilometraza: 190000
}];
U zadatom nizu automobila pronaći sve automobile čije godište je veće od 2010 godine i ispisati
osnovne podatke o njima.
ANALIZA:
Zadati niz automobila ima jasnu strukturu, potrebno je sa for petljom proći kroz dati niz i za svaki
element niza proveriti da li je njegov atribut godiste veći od 2010.
Rezultat:
Mazda 6
Ford Mondeo
Objekti
Dokument za polaznike 68
Front-end web development
Priručnik za pripremu
ZADATAK 3.8.4
Modifikovati zadatak 3.7.2. tako da koristi objekte. Objekat treba da sadrži atribute ime,
prezime, niz radnih sati u nedelji. Potrebno je modifikovati funkciju koja kao parametar prima
ime radnika, cenu radnog sata i broj radnih sati u nedelji kao i funkciju koja sabira broj sati u
nedelji tako da mogu da rukuju sa objektima.
ANALIZA:
Ovaj zadatak predstavlja nadogradnju na zadatak 3.7.2. tako da se sada koriste objekti, koji
sadrže sve informacije o jednom radniku. Objekat je zadat na sledeći način:
Objekti
Dokument za polaznike 69
Front-end web development
Priručnik za pripremu
var radnik = {
ime: "Pera",
prezime: "Peric",
radniSat: 1000,
radnaNedelja: [8, 9, 7, 8, 9]
}
Sada su sve informacije sadržane u jednom objektu radnik. Dalje je potrebno proslediti taj
objekat funkciji obracunajZaraduRadnika, međutim potrebno je promeniti funkciju tako da ima
jedan parametar koji predstavlja prosleđeni objekat. Izmenjena funkcija izgleda:
function obracunajZaraduRadnika(radnik) {
var ukupnoSati = izracunajUkupanBrojSati(radnik.radnaNedelja);
var ukupnaZarada = 0;
if (ukupnoSati > 40) {
ukupnaZarada = ukupnoSati * radnik.radniSat * 1.5;
} else {
ukupnaZarada = ukupnoSati * radnik.radniSat;
}
console.log(radnik.ime + " " + radnik.prezime
+ " ima platu od " + ukupnaZarada);
}
var radnik = {
ime: "Pera",
prezime: "Peric",
radniSat: 1000,
radnaNedelja: [8, 9, 7, 8, 9]
}
obracunajZaraduRadnika(radnik);
Objekti
Dokument za polaznike 70
Front-end web development
Priručnik za pripremu
Zadaci za vežbu:
1. Modifikovati zadatak 3.8.1. tako da se umesto godišta, filtriraju svi autmobili koji imaju
manje od 100 kilovati i manje od 1500 kubika
2. Nadograditi zadatak 3.8.3. tako da vrši računanje za nizove radnika. Odnosno funkcija
obracunajZaraduRadnika treba kao parametar da primi niz objekata radnik i da za
svakog izračuna platu.
3. Modifikovati zadatak 3.8.3. tako da koristi metode umesto funkcija, odnosno za svakog
radnika napraviti metodu izracunajUkupanBrojSati i obracunajZaraduRadnika. Pitanje za
razmišljanje nakon rešenog zadatka: Da li primećujete deo koji se ponavlja i kako bi se
to moglo rešiti?
Objekti
Dokument za polaznike 71
Front-end web development
Priručnik za pripremu
Ugrađeni tipovi
void Tip koji se koristi kada želimo da naznačimo da funkcija neće imati
povratnu vrednost.
any Promenljiva koja je tipa any može da bude bilo kog tipa. Koristi se kada
želimo da imamo dinamičku određivanje tipa kao u JavaScriptu ili kada
nismo sugrni kog tipa će biti neka promenljiva.
Тipovi podataka
Dokument za polaznike 72
Front-end web development
Priručnik za pripremu
Ukoliko pokušamo da dodelimo vrednost pogrešnog tipa (npr. brojčanu vrednost u promenljivu
tipa string) u promenljivu prilikom kompajliranja od kompajlera dobićemo poruku o grešci. U
većini slučajeva, u specijalizovanim tekst editorima, greška će biti prikazana i u toku pisanja
koda. Npr. u Visual Studio Code-u promenljiva će biti podvučena crvenom linijom, i ako se
pozicioniramo mišem na tu promenljivu biće prikazana poruka o grešci:
Anotiranje (dodela) tipova promenljivima nije obavezna. Ukoliko ne navedemo tip promenljive,
TypeScript će pokušati automatski da dodeli promenljivoj tip. Automatska dodela posmatra izraz
sa desne strane jednakosti prilikom definisanja promenljive i pokušava da odredi tip vrednost na
osnovu izraza. Ukoliko ne može da odredi tip vrednosti izraza ili ukoliko prilikom definisanja
promenljiva nije instancirana, TypeScript će dodeliti tip any toj promenljivoj:
Anotiranje nizova se vrši navođenjem uglastih zagrada (“[]”) nakon navođenja tipa vrednosti
elemenata niza:
<tip> promenljiva
ili
promenljiva as tip
Dobra praksa kada se koristi Type Assertion u izrazu je da bude okruzen zagradama:
4.4. Funkcije
TypeScript nam omogućava da pišemo funkcije na deskreptivniji način anotiranjem tipa
parametarа funkcije, tipa povratne vrednosti i korišćenjem opcionih i podrazumevanih
parametara. Аnotiranje parametara se vrši na isti način kao i anotiranje promenljivih
(navođenjem karaktera “:” i tipa parametara), dok se anotiranje povratne vrednosti navodi nakon
zagrada za navođenje parametara:
Gore navedena funkcija ima obavezan parametar ime tipa string i opcioni parametar prezime
tipa string, funkcija nema povratnu vrednost (nema return izraz) zbog čega je naveden tip void.
Funkciju predstavi se možemo da pozovemo prosleđivanjem samo parametra ime (pri čemu će
na konzolu biti ispisano samo ime u ispisu) ili prosleđivanjem parametra ime i opcionog
parametra prezime (pri čemu će na konzolu biti ispisano ime i prezime u ispisu).
Funkcije
Dokument za polaznike 74
Front-end web development
Priručnik za pripremu
Bitna napomena je da se svi opcioni parametri obavezno navode nakon obaveznih parametara.
Posebna vrsta opcionih parametara su parametri sa podrazumevanim vrednostima. Parametri
sa podrazumevanim vrednostima se navode tako što se priliko definicije funkcije, uz pomoć
karaktera “=”, dodeli podrazumevan vrednost parametru. Ukoliko korisnik pozove funkciju bez
prosleđivanja vrednosti za parametar sa podrazumevanom vrednošću, u toku izvršavanja
funckije će biti iskorištena podrazumevana vrednost, a ukoliko prosledi vrednost onda će biti
korišćena prosleđena vrednost kao vrednost parametra u toku izvršavanja funkcije:
pozdravi();
pozdravi("Dobar dan!")
4.5. Kompajliranje
TypeScript fajlove je potrebno kompajlirati (prevesti) u JavaScript fajlove upotrebom TypeScript
kompajlera. TypeScript komapjler se najlakse instalira kao Node.js paket:
1. Prvo je potrebno instalirati Node.js odlaskom na web stranicu https://nodejs.org/en/ i
izborom verzije koja je “Recommended For Most Users”:
Kompajliranje
Dokument za polaznike 75
Front-end web development
Priručnik za pripremu
2. Nakon instaliranja Node.js, u terminalu (command prompt ili power shell na windows-u) i
ukucati komandu: npm install -g typescript
tsc
Da bi koristili napisani kod, u html stranici potrebno je putem script taga dodati dobijen
JavaScript fajl. Napomena: ukoliko kompajliramo klase, koje u sebi imaju getere i setere,
prilikom pisanja komande za kompajliranje treba da dodamo i komandu -target “es5” npr.:
tsc imeFajla.ts -target “es5”
4.6. Zadaci
ZADATAK 4.6.1
Ispraviti zadatak 3.6.3 tako da se koristi TypeScript. Tekst zadatka: Napisati program koji
obračunava zaradu radnika. Radnici koji rade više od 40 sati nedeljno su plaćeni 1.5 puta više
nego sto bi bili plaćeni da rade do 40 sati nedeljno. Broj radnih sati je evidentiran u nizu po
danima, a cena radnog sata iznosi 1000 za svakog radnika.
REŠENJE
Pošto je TypeScript nadskup JavaScript programskog jezika, odnosno njegovo proširenje, mogli
bi da kopiramo kod iz rešenja zadatak 3.6.3. i time bi dobili valida TypeScript odnosno
JavaScript kod. Ali prednost TypeScripta je da možemo da anotiramo tipove promenljivih, pri
čemu anotiranje nije obavezno, kako bi lakše mogli da prepoznamo u kodu koje vrednosti treba
da budu u kojoj promenljivoj. Tako da bi jedno od validnih rešenja bilo sledeće:
Zadaci
Dokument za polaznike 76
Front-end web development
Priručnik za pripremu
NAPOMENA: Opšta preporuka je da se u TypeScript-u koristi ključna reč let umesto ključne
reči var.
ZADATAK 4.6.2
Prepraviti zadatak 3.7.1. tako da se koristi TypeScript. Tekst zadatka: Kazna za brzu vožnju
računa se kao 5000 din + 500 din za svaki kilometar preko ograničenja + 10000 din za vožnju
preko 120km/h. Napisati funkciju koja prima izmerenu brzinu vozila i ograničenje brzine. Ako je
brzina veća od dozvoljene funkcija vraća poruku sa cenom kazne, a ako je manja vraća poruku
da je sve u redu.
Iskoristiti podrazumevanu vrednost parametar funkcije tako da je u funkciji podrazumevano
ograničenje brzine 50.
REŠENJE
Za prepravku zadatak potrebno je samo da se izvrši anotiranje funkcije, parametara i
promenljivih, i da se postavi podrazumevana vrednost za jedan od parametara. Funkcija će
imati dva parametra tipa number, pri čemu parametar ograničenja ima podrazumevan vrednost
50, i povratan vrednost funkcije će biti tipa string:
Zadaci
Dokument za polaznike 77
Front-end web development
Priručnik za pripremu
ukupno +=
ukupno += fiksno
fiksno ++ dodatno;
dodatno;
return "Vasa
return "Vasa kazna
kazna iznosi
iznosi "" ++ ukupno;
ukupno;
}
}
let rezultat_01
let rezultat_01 == odrediKaznu(68,80);
odrediKaznu(68,80);
console.log(rezultat_01);
console.log(rezultat_01);
izvršavanja: Sve
//Rezultat izvršavanja: Sve je
je uu redu
redu
//---------------------------------------------
//---------------------------------------------
rezultat_02 == odrediKaznu(67,60);
let rezultat_02 odrediKaznu(67,60);
console.log(rezultat_02);
console.log(rezultat_02);
izvršavanja: Vasa
//Rezultat izvršavanja: Vasa kazna
kazna iznosi
iznosi 8500
8500
//----------------------------------------------
//----------------------------------------------
let rezultat_03
rezultat_03 == odrediKaznu(125,100);
odrediKaznu(125,100);
console.log(rezultat_03);
Za vežbanje prepraviti ostale zadatke iz JavaScript poglavlja 3.6. I 3.7. da koriste TypeScript.
Zadaci
Dokument za polaznike 78
Front-end web development
Priručnik za pripremu
1. Naziv klase
● naziv počinje velikim slovom
● sastoji se od jedne ili više imenica u jednini koje precizno opisuju sadržaj klase
● naziv klase treba da bude jedinstven
● naziv se piše u pascal case-u (upper camel case)2
1 https://en.wikipedia.org/wiki/Unified_Modeling_Language
2 https://en.wikipedia.org/wiki/Camel_case
Osnovni koncepti
Dokument za polaznike 79
Front-end web development
Priručnik za pripremu
Osnovni koncepti
Dokument za polaznike 80
Front-end web development
Priručnik za pripremu
Osnovni koncepti
Dokument za polaznike 81
Front-end web development
Priručnik za pripremu
Koja bi bila vrednost pera.ime? U ovom slučaju vrednost pera.ime bi bila „Sima Simic“.
Korišćenjem ključne reči new (1) kreiran je novi objekat u memoriji, a referenca pera je
postavljena tako da pokazuje na njega. Dodelom let sima: Radnik = pera (2) nije kreiran novi
objekat u memoriji, već je vrednost reference pera dodeljena novokreiranoj referenci sima, što
znači da suštinski reference sima i pera od tog trenutka pokazuju na isti objekat u memoriji. To
znači da će promena objekta korišćenjem bilo koje od te dve reference uzrokovati promene nad
tim jednim, zajedničkim objektom u memoriji.
Osnovni koncepti
Dokument za polaznike 82
Front-end web development
Priručnik za pripremu
5.1.4. Konstruktor
Konstruktor u TypeScriptu je posebna metoda koja konstruiše objekat neke klase. Za
definisanje konstruktora se koristi ključna reč constructor. Ukoliko se konstruktor ne navede
eksplicitno unutar neke klase, ta klasa će imati podrazumevani konstruktor (konstruktor koji
nema parametre). U TypeScriptu moguće je imati samo jedan konstruktor u klasi.
Primer sa konstruktorom bez parametara:
class Radnik {
ime: string;
radnoVremeNedeljno: number;
ukupnoOdradjenoSatiNedeljno: number;
osnovica: number;
koeficijentRada: number;
Osnovni koncepti
Dokument za polaznike 83
Front-end web development
Priručnik za pripremu
class Radnik {
ime: string;
radnoVremeNedeljno: number;
ukupnoOdradjenoSatiNedeljno: number;
osnovica: number;
koeficijentRada: number;
//Konsturktor sa parametrima
constructor(novIme, novoRVN, novoUOSN, novaOsnovica, noviKR){
this.ime = novIme;
this.radnoVremeNedeljno = novoRVN;
this.ukupnoOdradjenoSatiNedeljno = novoUOSN;
this.osnovica = novaOsnovica;
this.koeficijentRada = noviKR;
}
Konstruktor se može pozvati samo upotrebom operatora new, tako pozvani konstruktor
instancira odgovarajući objekat.
3
U ovom slučaju termin vidljivost ne odnosi se na to da li neko može da vidi da li se u kodu neke klase
nalazi član (atribut ili metoda), već se odnosi na mogućnost pristupa tom članu klase kada koristimo
objekat te klase.
Osnovni koncepti
Dokument za polaznike 84
Front-end web development
Priručnik za pripremu
U UML dijagramima public članovi su obeleženi sa prefikosm „+“, private članovi sa prefiskom „-
„ i protected članovi sa prefiksom „#“, npr.:
Na gore navedenoj slici za private članove klase obeleženi su atributi klase (ime,
radnoVremeNedeljno i sl), a metode su obeležene sa public modifikatorom. Što znači da, u
ovom kontretnom slučaju, ne bismo mogli direktno da pristupam atributima sa kodom koji se
nalazi izvan klase. Kod klase:
class Radnik {
private _ime: string;
private _radnoVremeNedeljno: number;
private _ukupnoOdradjenoSatiNedeljno: number;
private _osnovica: number;
private _koeficijentRada: number;
public constructor(){
}
Ako bi pokušali direktno da menjamo vrednost atributa kao u primeru sa referencama, dobili
bismo grešku od kompajlera jer ti atributi više nisu vidljivi. Za pristup private atributima obično
se pišu public metode koje njima pristupaju, takozvani geteri i seteri. NAPOMENA: Po
konvenciji imenovanja u TypeScript private atributi bi trebalo da počnu sa donjom crtom “_”.
(Nije obavezno poštovati konvencije)
donosi ovaj princip je: smanjenje potencijalnih greška koje bi napravili programeri prilikom
neadekvatne upotrebe klase sa čijim implementacionom detaljima nisu upoznati; omogućava
lakšu ponovnu upotrebu klasa u drugim delovim programa; znatno smanjuje posao prilikom
održavanja/promene implementacije neke klase.
U opštem slučaju, preporuka u objektnom programiranju je da ako nešto može da bude private
u klasi to i treba da bude private u klasi.
Kao trivijalan primer možemo posmatrati implementaciju klase trougao. Trougao se sastoji od 3
stranice a, b, c, koje prave zatvorenu figuru čiji unutrašnji zbir uglova je 180⁰.
Ukoliko imamo klasu kao na slici, sa public atributima, programer koji koristi tu klasu može da
napiše sledeće:
let t: Trougao = new Trougao();
t.a = 12;
t.b = 3;
t.c = 4;
Gore navedeni kod je sintaksno ispravan, ali suštinski pogrešan jer programer koji je koristio
klasu trougao nije bio dovoljno upoznat sa činjenicom da trougao ne može da ima stranice tih
dimenzija. Odnosno dobili smo figuru sledećeg oblika:
Takva figura bi prouzrokovala grešku u radu programa kada bi je koristili u našem programu kao
trougao (npr. u jednom trenutku treba da se izračunaju uglovi, ili visina trougla i sl.).
Sakrivanje implementacionih detalja bi sprečilo da nam se dogode takve greške, tj. programer
koji treba da napiše tu klasu bi napisao i metodu za postavljanje stranica trougla koja bi vršila
sve bitne provere (da li stranice zapravo pripadaju trouglu i sl.) i tek onda izmenila vrednosti
atributa. Čime bi izbegli grešku koja se desila u kodu iznad.
Osnovni koncepti
Dokument za polaznike 86
Front-end web development
Priručnik za pripremu
Kao što se vidi na slici, atributi u klasi se obično proglašavaju privatnim. Da bi se moglo
pristupati tim atributima potrebno je kreirati public metode get i set za svaki pojedinačni atribut
(popularni geteri i seteri). Na taj način se može kontrolisati mogućnost pisanja (samo set
metoda) i mogućnost čitanja vrednosti atributa (samo get metoda). Konvencija pisanja naziva
metoda je get + ime atributa ili set + ime atributa. U set metodi se često dodaje i validacija
unetih podatak, tj. provera da li je nova vrednost koja je prosleđena ispravna.
U TypeScriptu, implementacija getera i setera se razlikuju od implementacije getera i setera u
klasični OO jezicima tako što se geteri i seteri ne tretiraju kao obične metode:
● Za kreiranje getera i setera koriste se ključne reči get i set pre imena metode
● Metode geter i setera se ne pozivaju kao ostale metode (upotrebom zagrada () ), već se
koriste kao što bi koristili public atribute
● Pristupa im se isključivo sa dot (.) notacijom
● Po konvenciji imenovanja get i set metode trebalo bi da imaju isti naziv (bez donje crtice)
kao i private atribut kome pristupaju
Primer:
Osnovni koncepti
Dokument za polaznike 87
Front-end web development
Priručnik za pripremu
class Trougao {
private _a: number;
private _b: number;
private _c: number;
this._a = v;
} else {
console.log("Nije uneta stranica trougla");
}
}
//Poziv gettera
console.log(t.a);
if(t.a > t.b){
console.log("Pozvani geteri a i b");
}
5.1.7. this4
Ključna reč „this“ u JavaScriptu se odnosi na objekat kome „this“ pripada. Upotreba ključne reči
„this“ u JavaSciptu je malo složenija nego u klasičnim OO programskim jezicima. Ukratko:
4 Više o this-u možete pronaći u knjizi You Don’t Know JS koja se nalazi na linku:
https://github.com/getify/You-Dont-Know-
JS/blob/master/this%20&%20object%20prototypes/README.md#you-dont-know-js-this--object-
prototypes
Osnovni koncepti
Dokument za polaznike 88
Front-end web development
Priručnik za pripremu
class Student {
ime: string; //Atribut ime
prosek: number; //Atribut prosek
Kao što je već rečeno, ključna reč „this“ se koristi i u svim ostalim metodama klase koje
referenciraju atribute te iste klase. Bitno je voditi računa na šta se „this“ odnosi, u slučaju ako
imamo metodu koja treba da doda funkciju koja će reagovati na neki event dom elementa
(event listner) u toj funkciji nećemo moći da koristimo this kako bi referencirali atribute klase.
5.1.8. Zadaci
ZADATAK 5.1.1
Modifikovati zadatak 3.8.1. tako da se koriste klase. U klasi implementirati konstruktor sa
parametrima, ispoštovati princip sakrivanja informacija (atributi treba da budu private i da imaju
getere i setere).
ANALIZA:
Iz rešenja zadatka vidimo da objekat automobil se sastoji od 6 atributa i 2 metode.
U klasi pored privatnih atributa imaćemo konstruktor sa parametrima i getere-setere za sve
atribute. Pored getera i setera imaćemo dve metode: izracunajHP i povecajBrKilometara. Prva
metoda vraća broj koji predstavlja količinu konjskih snaga, a druga metoda nema povratnu
vrednost (samo povećava broj pređenih kilometara).
Osnovni koncepti
Dokument za polaznike 89
Front-end web development
Priručnik za pripremu
var automobil = {
model: "6",
proizvodjac: "Mazda",
kubikaza: 1998,
kilovata: 100,
godiste: 2015,
kilometraza: 134000,
izracunajHP: function() {
return this.kilovata * 1.34;
},
povecajBrKilometara: function(vrednost) {
this.kilometraza = this.kilometraza + vrednost;
}
}
Osnovni koncepti
Dokument za polaznike 90
Front-end web development
Priručnik za pripremu
class Automobil {
private _model: string;
private _proizvodjac: string;
private _kubikaza: number;
private _kilovata: number;
private _godiste: number;
private _kilometraza: number;
Osnovni koncepti
Dokument za polaznike 92
Front-end web development
Priručnik za pripremu
//Testiranje:
let automobil: Automobil = new Automobil("6", "Mazda", 1998, 100, 2015,
134000);
console.log("Konjskih snaga: " + automobil.izracunajHP());
//Rezultat: Konjskih snaga: 134
automobil.povecajBrKilometara(6000);
console.log(automobil.kilometraza);
//Rezultat: 140000
ZADATAK 5.1.2.
Modifikovati zadatak 3.8.3. tako da se koriste klase. Svi atributi objekta treba da budu atributi
klase, a funkcije iz zadatka koje su vezane isključivao za radnika možemo da implementiramo
kao metode klase.
ANALIZA:
Ovaj zadatak predstavlja proširenje zadatka 3.8.3. tako da se koriste klase. Kao što je
navedeno u tekstu, klasa je šablon koji opisuje karakteristike objekta, a na osnovu objekta iz
radnik iz zadatka 3.8.3. možemo identifikovati te karakteristike:
var radnik = {
ime: "Pera",
prezime: "Peric",
radniSat: 1000,
radnaNedelja: [8, 9, 7, 8, 9]
}
Iz navedenog objekta vidimo da naša klasa treba da ima 4 atributa. Kako bi bio ispoštovan
princip sakrivanja informacija, koji je bitan za OOP, atributi će biti privatni i u klasi je potrebno
imati getere i setere za njih. Pored getera i setera, može da se implementira i konstruktor sa
parametrima kako bi olakšao pravljenje novih objekata. Funkcije izracunajUkupanBrojSati i
obracunajZaraduRadnika mogu da postanu metode klase, a pošto će uvek pristupati objektu
radnika za koje su instancirane, umesto parametra mogu da koriste this kako bi prisutpile bitnim
atributima.
Osnovni koncepti
Dokument za polaznike 93
Front-end web development
Priručnik za pripremu
class Radnik {
private _ime: string;
private _prezime: string;
private _radniSati: number;
private _radnaNedelja: number[];
Osnovni koncepti
Dokument za polaznike 94
Front-end web development
Priručnik za pripremu
Zadaci za vežbu:
1. Modifikovati zadatke iz poglavlja 3.8. tako da se koriste klase.
2. Napisati klasu Pas. Svaki pas ima ime, starost (u psećim godinama), podatak da li je
vakcinisan i naziv rase. Napisati konstruktor (sa podrazumevanim vrednostima za
parametre), gettere i settere. Psa je moguće vakcinisati, ispisati njegovu starost u
ljudskim godinama*, ispisati sve podatke o psu. (napraviti metode za navedene
funkcionalnosti). *Napomena: Jedna pseća godina je 7 ljudskih.
Osnovni koncepti
Dokument za polaznike 95
Front-end web development
Priručnik za pripremu
5.2. Nasleđivanje
Nasleđivanje se može definisati kao proces u kome jedna klasa preuzima (nasleđuje) osobine
(atribute i metode) neke druge klase. Klasa koja se nasleđuje obično se zove natklasa (super
class, ili roditeljska klasa) a klasa koja nasleđuje osobine se naziva potklasa (sub class, ili
naslednik). Upotreba mehanizma nasleđivanja omogućava hijerarhijsko modelovanje klasa na
osnovu njihovih odgovornosti i zaduženja.
Instanca objekta potklase će sadržati sve osobine koje sadrži i instanca natklase, pri čemu će
objekat potklase imati dodatne osobine koje definiše potklasa. Zbog toga se u konstruktoru
potklase poziva konstruktor natklase (kako bi se inicijalizovale nasleđene osobine).
U TypeScriptu nasleđivanje se postiže upotrebom ključne reči extends, kao što je ilustrovano u
narednoj tabeli. Postoji nekoliko tipova nasleđivanja:
Tip nasleđivanja: Kod:
Jednostruko nasleđivanje:
class A { ... }
class B extends A { ... }
Višesložno nasleđivanje:
class A { ... }
class B extends A { ... }
class C extends B { ... }
Nasleđivanje
Dokument za polaznike 96
Front-end web development
Priručnik za pripremu
Hijerarhijsko nasleđivanje:
class A { ... }
class B extends A { ... }
class C extends A { ... }
Kao što se vidi na slici, sve tri klase dele određene atribute (ime, prezime, korisnicko_ime,
lozinka) i metode (metode za rukovanje atributima, metoda za logovanje i sl.). Jedan od
problema sa ovim načinom modelovanja je višestruka implementacija identičnih metoda na više
mesta. Sve gore prikazane zajedničke metode rade identičan posao, i ne bi bilo loše da ih
možemo implementirati na jednom mestu. To bi mogli da postignemo upotrebom nasleđivanja i
sve zajedničke osobine da stavimo u natklasu. A ukoliko se kasnije mora održavati neka
Nasleđivanje
Dokument za polaznike 97
Front-end web development
Priručnik za pripremu
TypeScript kod za primer nasleđivanja između klasa Korisnik i Kupac je dat u tekstu ispod:
Nasleđivanje
Dokument za polaznike 98
Front-end web development
Priručnik za pripremu
class Korisnik {
//Ovi atributi bi mogli da budu protected
//Radi jednostavnosti primera to je izostavljeno
private _ime: string;
private _prezime: string;
private _korisnicko_ime: string;
private _lozinka: string;
Nasleđivanje
Dokument za polaznike 99
Front-end web development
Priručnik za pripremu
Nasleđivanje
Dokument za polaznike 100
Front-end web development
Priručnik za pripremu
5.2.1. Polimorfizam
Po jednoj od definicija, polimorfizam (u programskim jezicima) je obezbeđivanje jedinstvenog
interfejsa entitetima različitih tipova. Polimorfizam često se koristi u programskim jezicima i
znatno olakšava implementaciju funkcionalnosti koje su zajedničke za više klasa. Najčešća
upotreba polimorfizma u OO jezcima je upotreba referenci natklase kako bi se referencirao
objekat potklase (kao u primeru za dodavanje komentara kod korisnika online prodavnice).
Primer:
// ili
Pošto klasa Kupac nasleđuje klasu Korisnik, objekat klase Kupac će sadržati sve osobine koje
bi sadržao i objekat klase Korisnik (slika, osobine obeležene crvenom bojom). Odnosno, svaki
Kupac je Korisnik, ali svaki Korisnik nije Kupac. Tako da je dodela objekta klase Kupac
promenljivoj tipa Korisnik moguća, a u suprotnom smeru nije dozvoljeno zato što objekat
nadklase ne bi sadržao sve osobine podklase (npr. osobine ofarbane plavom bojom na slici).
Nasleđivanje
Dokument za polaznike 101
Front-end web development
Priručnik za pripremu
Pošto su promenljive zapravo reference na objekat, korisnik koji koristi referencu tipa nadklase
će moći da pristupa osobinama samo za koje ta referenca zna. Iako taj objekat u sebi sadrži
više podataka (atributa i/ili metoda) korisnik će moći samo da koristi ono što je poznato tipu te
promenljive, u konkretnom primeru samo osobine klase Korisnik.
Nasleđivanje
Dokument za polaznike 102
Front-end web development
Priručnik za pripremu
class Osoba {
ime: string;
prezime: string;
constructor(ime: string, prezime: string){
this.ime = ime;
this.prezime = prezime;
}
predstaviSe(): void {
console.log("Ja sam " + this.ime + " " + this.prezime);
}
}
Nasleđivanje
Dokument za polaznike 103
Front-end web development
Priručnik za pripremu
5.2.3. Zadaci
ZADATAK 5.2.1
Napisati klasu Poruka. Klasa Poruka se sastoji se od:
• Atributa:
o naziv_posiljaoca (string),
o naziv_primaoca (string),
o sadrzaj_poruke (string).
• Konstruktora sa parametrima
• Metoda:
o stampaj (void),
▪ metoda stampaj ispisuje vrednost atributa u konzolu
o getera i setera.
Napisati klasu SMSPoruka koja nasleđuje klasu Poruka. Klasa SMSPoruka ima dva dodatna
atributa: broj_telefona_posiljaoca (string), broj_telefona_primaoca (string). Pored getera i setera
za nove atribute, u klasi SMSPoruka redefinisati metodu stampaj tako da se ispisu i dodati
atributi klase SMSPoruka.
ANALIZA:
Implementiranje klase Poruka radimo po šablonu klasa, gde atribute možemo da označimo sa
modifikatorm pristupa protected (videti poglavlje 5.1.5.). Atributi mogu da budu i private, ali u
tom slučaju ako budemo morali da pristupamo tim atributima u klasi naslednice, umesto
direktnog pristupa, morali bi da koristimo getere i setere.
Nasleđivanje
Dokument za polaznike 104
Front-end web development
Priručnik za pripremu
class Poruka {
protected _naziv_posiljaoca: string;
protected _naziv_primaoca: string;
protected _sadrzaj_poruke: string;
Klasa SMSPoruka nasleđuje klasu poruka, što znači da konstruktor podklase mora da pozove
konstruktor nadklase upotrebom ključne reči super:
Nasleđivanje
Dokument za polaznike 105
Front-end web development
Priručnik za pripremu
ZADATAK 5.2.2
Napisati klasu EmailPoruka koja nasleđuje klasu Poruka. Klasa EmailPoruka ima dva dodatna
atributa: email_posiljaoca (string), email_primaoca (string). Pored getera i setera za nove
atribute, u klasi EmailPoruka redefinisati metodu stampaj tako da se ispisu i dodati atributi klase
EmailPoruka.
ZADATAK 5.2.3.
Napisati klasu Smestaj. Klasa Smestaj sastoji se od:
• Atributa:
o naziv (string),
o adresa (string),
o grad (string).
• Konstruktora sa parametrima.
• Metoda:
o stampaj (void),
▪ metoda stampaj ispisuje vrednost atributa u konzolu
Nasleđivanje
Dokument za polaznike 106
Front-end web development
Priručnik za pripremu
o getera i setera.
Napisati klasu Hotel koja nasledjuje klasu Smestaj. Klasa hotel ima dodatan atribut
broj_zvezdica (number). Pored getera i setera za nove atribute, u klasi Hotel redefinisati metodu
stampaj tako da se ispisu i dodati atributi klase Hotel. Implementirati i metodu predstaviSe (void)
koja ukratko opisuje hotel (u konzolu ispisuje tekst npr. „Hotel Sheraton, Novi Sad, je hotel sa 4
zvezdice“, gde su podaci o nazivu, gradu i zvezdicama vrednosti atributa).
5.2.4. Interfejsi
U mnogim OO jezicima klase podržavaju samo jednostruko nasleđivanje, tj. klase mogu da
naslede samo jednu klasu. To može da bude veoma ograničavajuće, posebno kada određena
klasa naslednica (i sve njene naslednice) kao i druge klase u hijerarhiji klasa treba da imaju
neko zajedničko ponašanje.
U OO jezicima interfejs je kolekcija metoda koji ukazuju da klasa poseduje neko ponašanje
pored onoga koje nasleđuje od natklase. Interfejs ne sadrži implementaciju metoda, već samo
naznačava da klasa koja implementira interfejs mora da implementira i metode koje su
navedene u interfejsu.
Neke od razlika između interfejsa i klasa su:
● Interfejs se ne može instancirati;
● Interfejs ne sadrži konstruktore;
● Sve metode u interfejsu su apstraktne (sadrže samo definiciju metoda);
● Interfejs ne sadrži polja tj. atribute – (Interfejsi u TypeScript ovo dozvoljavaju);
● Klase ne nasleđuju interfejse, već ih implementiraju upotrebom ključne reči implements;
● Klasa može da implementira više interfejsa;
● Interfejs može da nasledi više drugih interfejsa upotrebom ključne reči extends.
Primer upotrebe interfejsa:
Nasleđivanje
Dokument za polaznike 107
Front-end web development
Priručnik za pripremu
interface Animal {
talk: () => void;
noOfLegs: () => number;
}
Nasleđivanje
Dokument za polaznike 108