Deo zbornika Napredni Javaskript
Metodi call i apply
Objekti funkcije u Javascriptu imaju metode call()
i apply()
, koje omogućuju objektima da pozajme metode od drugih objekata i pozovu ih kao svoje.
Ovo je lak i moćan način za ponovnu upotrebu koda.
Primer: objekat sa metodom
Na primer, objekat ninja
ima metodu pozdrav()
, koja koristi this.nadimak
da se predstavi:
const ninja = {
nadimak: 'Ninja',
pozdrav(prijatelj) {
console.log('Zdravo prijatelju ' + prijatelj + ', ja sam ' + this.nadimak)
}
}
ninja.pozdrav('Betmen')
call
Sad ćemo kreirati drugi objekat guru
, koji sadrži svojstvo nadimak
. On može pozvati metod pozdrav()
objekta ninja
, kao da je njegov. Ovo je moguće pomoću metoda call()
sa funkcije objekta pozdrav()
:
const ninja = {
nadimak: 'Ninja',
pozdrav(prijatelj) {
console.log('Zdravo prijatelju ' + prijatelj + ', ja sam ' + this.nadimak)
}
}
const guru = {
nadimak: 'Javascript guru'
}
ninja.pozdrav('Betmen')
ninja.pozdrav.call(guru, 'Superhik')
Šta se dođavalo desilo ovde? Pozvali smo ugrađenu metodu call()
, sa objekta funkcije pozdrav()
, tako što smo prosledili dva parametra - objekat guru
i strunu 'Superhik'
. Rezultat je da this
sada ukazuje na objekat guru
, a this.nadimak
na 'Javascript guru'
.
apply
Metod apply()
radi isto što i call()
, a razlika je u tome što se svi parametri nakon prvog prosleđuju kao niz. Sledeće dve linije koda su ekvivalentne:
ninja.someMethod.apply(guru, ['a', 'b', 'c'])
ninja.someMethod.call(guru, 'a' , 'b', ' c' )
Primer: pozajmljivanje map metode
document.querySelectorAll
ne vraća niz (array) već listu čvorova (nodeList), koja nema map
metodu. Međutim, možemo pozvati metodu niza map
na listi čvorova, na sledeći način:
const pasusi = document.querySelectorAll("p")
Array.prototype.map.call(pasusi, x => x.innerText)
Literatura
- Ved Antani, Stojan Stefanov, Objektno-orjentisan JavaScript, Beograd, 2017.