Javascript ir OOP
5 (100%) 1 vote

Javascript ir OOP

Objektai

JavaScript kalboje sutiksite begalę objektų. Masyvai yra objektai. Funkcijos yra objektai. Objektai yra objektai. Tačiau kas yra objektai iš tiesų? JavaScript objektai – tai vardo ir reikšmės sąrašai. Vardai yra simbolių sekos, o reikšmės gali būti skaičiai, simbolių sekos, loginės reikšmės bei objektai (taip pat masyvai ir funkcijos). JavaScript objektai naršyklėse paprastai įgyvendinami sąrašų (hashtable)pagalba, kad reikšmės galėtų būti gražinamos kuo greičiau.
Jeigu reikšmė vardo-reikšmės sąraše yra funkcija, galime laikyti, kad tai metodas. Kai iškviečiamas objekto metodas, metodo kintamasis this laiko nuorodą į objektą. Per šį kintamąjį metodas turi priėjimą kitų jį iškvietusio objekto metodų.
Visi objektai yra kuriami per konstruktorių – funkciją, kuri parengia objektą darbui. Konstruktoriai JavaScript kalboje suteikia tokias galimybes, kokias kitose kalbose suteikia klasės (taip pat statinius laukus ir metodus).
Ar JavaScript yra objektiškai orientuota programavimo kalba (OOP)?
JavaScript objektai laiko duomenis bei metodus, kurie jais operuoja. JavaScript objektai gali susidėti iš kitų objektų.
JavaScript neturi klasės (class) raktažodžio savo sintaksėje, tačiau palaiko konstruktoriaus metodus, kurie atlieka tai, ką klasės daro kitose OOP kalbose: saugo objekto duomenis ir metodus.
JavaScript neturi tiesioginio klasių paveldėjimo, bet paveldimumas įgyvendinamas naudojant prototipus.
Du pagrindiniai būdai kurti objektų struktūras OOP kalbose yra paveldėjimas (ryšys: yra) ir agregacija (ryšys: turi). JavaScript ne tik palaiko juos abu. Tuo tarpu dinamiška kalbos prigimtis, leidžia naudoti agregaciją ir po klasės apibrėžimo. Tai leidžia objektų struktūrą dinamiškai keisti bet kuriuo programos vykdymo momentu (kas visiškai neįmanoma statinėse OOP kalbose).
Kartais sakoma, kad JavaScript nėra visiškai objektiškai orientuota, nes ji negali maskuoti objektų informacijos. T.y. objektai neturi privačių (private) laukų bei metodų. Visi objekto nariai yra vieši (public).
Tačiau iš tiesų JavaScript gali palaikyti privačius laukus ir metodus. Žinoma, nedaugelis tą supranta ir išnaudoja, nes JavaScript yra viena menkiausiai išaiškintų programavimo kalbų.
Kartais argumentuojama, kad JavaScript nėra pilnai objektiškai orientuota, nes nepalaiko paveldėjimo. Bet kaip vėliau paaiškėja, JavaScript ne tik palaiko klasikinį paveldėjimą (prototipų strategija), bet ir daugelį kitų daugkartinio kodo panaudojamumo šablonų.
Pateiksime kelis šių faktų įrodymus ir išsiaiškinsime kaip jie veikia.

Ar JavaScript palaiko agregaciją.

Turime dvi paprastas JavaScript „klases“ (funkcijas). Pirmoji klasė lenktynininkas (Racer), aprašo objektą, kuris turi vardą (name). Laikantis OOP principų, vardui gražinti ir įrašyti naudosime getName ir setName metodus. Mūsų lenktynininkas taip pat moka trumpai prisistatyti metodu Hello.

function Racer() { }
Racer.prototype = {
  name: null,
  getName: function() { return this.name },
  setName: function(name) { this.name = name },
  Hello: function() { alert("Hi, I`m your driver, " + this.name + "! Let`s take a ride!") }
};

Kaip minėta anksčiau, objekto laukai ir metodai aprašomi naudojant prototipų paveldimumą. T.y. tuščia „klasė“ Racer praplečiama lauku name ir metodais getName, setName bei Hello per objekto prototype lauką.

Antroji klasė (Car) aprašo automobilį ir turi du laukus: name (automobilio pavadinimas) ir driver (vairuotojas). Bei metodą Hello (prisistatymui). Atkreipkite dėmesį, nors žinoma, kad automobilio vairuotojas greičiausiai bus Racer objektas, tai niekaip nenurodoma programos kode. Taip yra todėl, kad JavaScript yra silpnai tipizuota kalba ir objektas gali keisti tipą dinamiškai (pvz. atliekant priskyrimo veiksmą). Tačiau, tai dar nereiškia, kad objekto tipo negalima identifikuoti.

function Car(name) {
  this.name = name;
}
Car.prototype = {
  driver: null,
  setDriver: function() { return this.driver },
  setDriver: function(driver) { this.driver = driver },
  Hello: function(){ 
    alert("I am, " + this.name + " weels driven by " + this.driver.getName() + "."); 
  }
};

Turbūt pastebėjote, kad automobilio pavadinimas (name) perduodamas per konstruktorių (Car). Tokia formuluotė leis greičiau parengti Car objektą darbui. Tuo tarpu metodu setDriver bus nurodoma, kas vairuoja automobilį.

Šiame kode panaudojamos abi klasės Racer ir Car.

var me = new Racer();
me.setName("Max");
var car = new Car("Suzuki");
car.setDriver(me);
car.driver.setName("Mr. Max");
car.Hello();
car.driver.Hello();

Pirma sukuriame asmenį me. Pavadiname jį Max. Sukuriame automobilį bei pavadiname jį Suzuki. Nurodome, kad automobilį vairuos ponas Max (objektas me) ir pervadiname mūsų vairuotoją į (Mr. Max). Pabaigoje leidžiame prisistatyti automobiliui (car.Hello()) ir jo vairuotojui (car.driver.Hello()).

Šiuo metu Jūs matote 51% šio straipsnio.
Matomi 725 žodžiai iš 1429 žodžių.
Siųskite sms numeriu 1337 su tekstu INFO MEDIA (kaina 1,45 €) ir įveskite gautą kodą į laukelį žemiau:
Kodas suteikia galimybę atrakinti iki 100 straispnių svetainėje ir galioja 24 val.