Uvod do Javascript OOP

Uvod do Javascript OOP

7. 12. 2013

Aj napriek rozsirenosti Javascriptu, je slabe povedomie o jeho OOP schopnostiach. V porovnani s inymi objekto orientovanymi jazykmi je tu mnoho rozdielov a preto je cielom kritiky, neporozumenia a nekonecnych debat.

Javascript nema k dispozicii class (ak nehovorime o ES6), namiesto toho pouziva prototype-based programovanie.

Trieda

Triedy Javascript definuje rovnako ako funkcie. V nasledujucom priklade si ukazeme ako definovat triedu Osoba:

function Osoba() { }

Objekt (instancia triedy)

Pre vytvorenie novej instancie triedy pouzivame klucove slovo new. Vytvorme si 2 instancie osoba1 a osoba2, triedy Osoba:

var osoba1 = new Osoba();
var osoba2 = new Osoba();

Konstruktor

Konstruktor je vyvolany v momente vytvorenia instancie. Kedze funkcia, ktora definuje triedu sluzi zaroven aj ako konstruktor, nieje nutne definovat konstruktor samostatne.

Konstruktor sluzi pre nastavenie vlastnosti objektu a pre vyvolanie metod, ktore predpripravia objekt.

function Osoba(meno) {
    this.meno = meno;
}

var osoba1 = new Osoba('Jan');

console.log('Meno osoby je ' + osoba1.meno);

K vlastnostiam objektu vo vnutri triedy pristupujeme cez this, ktory odkazuje na aktualny objekt. Z vonku pristupujeme cez nazovInstancie.vlastnost.

Metody

Pre metody plati rovnaky pristup ako pre vlastnosti, s tym rozdielom, ze su definovane ako funkcie a vyvolavane pridanim zatvoriek (). Metody definujeme cez vlastnost objektu prototype.

function Osoba(meno) {
    this.meno = meno;
}

Osoba.prototype.pozdrav = function() {
    console.log('Ahoj volam sa ' + this.meno);
};

var osoba1 = new Osoba('Jan');

osoba1.pozdrav();

Kedze metody definujeme priradenim funkcie vlastnosti, nezabudnite na konci dat bodkociarku ;.

Nepriradujte premenne cez prototype

Predvolene hodnoty vlastnosti definujte cez konstruktor. Ak definujete vlastnost, ktora nieje primitivnym typom (ako polia a objekty), cez prototype, spravanie vlastnosti bude ine, ako by ste ocakvali:

function Osoba(meno) {
    this.meno = meno;
}

Osoba.prototype.predmety = ['kniha', 'kompas', 'kluc'];

Osoba.prototype.ukazPredmety = function() {
    console.log(this.meno, this.predmety);
};

var osoba1 = new Osoba('Jan');
var osoba2 = new Osoba('Adam');

osoba1.ukazPredmety(); // Jan ["kniha", "kompas", "kluc"] 
osoba2.ukazPredmety(); // Adam ["kniha", "kompas", "kluc"] 

osoba1.predmety.push('mec');

osoba1.ukazPredmety(); // Jan ["kniha", "kompas", "kluc", "mec"] 
osoba2.ukazPredmety(); // Adam ["kniha", "kompas", "kluc", "mec"] 

Dedenie

// definovanie triedy Osoba
function Osoba() {}

Osoba.prototype.povedzAhoj = function() {
    console.log('ahoj');
};

// definovanie triedy Student
function Student() {
    // Vyvolanie rodicovskeho konstruktora
    Osoba.call(this);
}

// dedenie
Student.prototype = Object.create(Osoba.prototype);

// prepiseme metodu povedzAhoj
Student.prototype.povedzAhoj = function() {
    console.log('ahoj, som student');
};

var student = new Student();
student.povedzAhoj(); // ahoj, som student

// overenie dedicnosti
console.log(student instanceof Osoba); // true
console.log(student instanceof Student); // true
comments powered by Disqus