Skip to content
Az oldal tartalma

Osztályok

Osztályok létrehozása

ES-ben az osztályokat a többi nyelvhez hasonlóan a class kulcsszó segítségével definiálhatjuk.

JavaScript
class Triangle{

}

Tulajdonképpen egy ilyen módon létrehozott osztály, egy speciális függvényként fog működni a háttérben, ami egy Objectet ad vissza nekünk. Így amikor a létrejött példányunak vizsgáljuk ne lepődjünk meg rajta, hogy egy Objectként fogjuk látni.

Adattagok és tagfüggvények

Az adattagjaink (azaz az oszályon belüli változóink), valamint a tagfüggvényink (azaz az osztályon belüli függvényeink) felvétele egyszerűsödik, ugyani nem kell a változót (let,var,const) vagy a függvényt (function) jelző kulcsszót kiírnunk.

Amikor felhasználjuk az osztályon belüli adattagokat (vagy tagfüggvényeket), akkor minden esetben ki kell írni a this kulcsszót elé.

JavaScript
class Triangle{
  a_side;
  b_side;
  c_side;

  //kerulet
  perimeter(){
    return this.a_side + this.b_side + this.c_side
  }
}

Konstruktor

A példányunk inicializását ES-ben a constructor nevű speciális függvény segítségével tudjuk megtenni.

JavaScript
class Triangle{
  a_side;
  b_side;
  c_side;

  constructor(a,b,c){
    this.a_side = a;
    this.b_side = b;
    this.c_side = c;
  }

  //kerulet
  perimeter(){
    return this.a_side + this.b_side + this.c_side
  }
}

Példányosítás

Egy új példányt úgy tudunk létrehozni az osztályunkból, hogy new kulcsszó segítségével és az Osztály nevét használjuk fel. Ekkor a paraméterezés a konstruktornak megfelelően történik.

JavaScript
const tri1 = new Triangle(6,8,10);

Privát tagok és Getter-setter tagjaik

ES2022 óta képe a nyelv arra, hogy privát adattogat és tagfüggvényeket kezeljen. Ez úgy fog történni, hogy a megfelelő változót lellátjuk egy hashmark (#) karakterrel. Innentől kezdve konstruktoron és a tagfüggvényeken keresztuk tudjuk állítani az adattagunkat, azonban, az osztályon kívül nem fogjuk tudni felhasználni azt. Erre lesz megoldás a get valamint a set jelzésű függvény.

Vigyázat, habár függvényként definiáljuk, a felasználásakor valójában változóként bánunk vele!

JavaScript
class Triangle{
  #a_side;
  #b_side;
  #c_side;

  constructor(a,b,c){
    this.#a_side = a;
    this.#b_side = b;
    this.#c_side = c;
  }

  get A(){
    return this.#a_side;
  }

  set A(newValue){
    this.#a_side = newValue;
  }

  //kerulet
  perimeter(){
    return this.#a_side + this.#b_side + this.#c_side
  }
}

const tri1 = new Triangle(3,4,5);

tri1.A = 6;
console.log(tri1.A);

Osztály színű tagok

Osztály szintű tagokat a static kulcsszóval ellátva tudunk létrehozni. Ekkor az adattagunk vagy tagfüggvényünk az osztály bármely példányától függetlenül működik

JavaScript
class User{
  id;
  username;
  #password;

  static idGen = 0;

  constructor(un,pw){
    this.username = un;
    this.#password = pw;

    id = User.idGen;
    User.idGen++;
  }

  set Password(newPass){
    this.#password = newPass;
  }

  static compare(userA, userB){
    return userA.id - userB.id;
  }
}

...

const users = [....];
users.sort(User.compare)

A fenti példában az idGen-t arra tudtuk felhasználni, hogy minden egyes példány esetében a következő számot fogja id-ként s flehaszánlóhoz rendelni. Ugyanúgy mint a MySQL esetében az Auto incrementel megjelölt kulcs.

A compare függvény esetében pedig az volt a cél, hogy két felhasználót össze tudjuk haszonlítani, azonban a felhasználókat nem egy konkrét példánynak adjuk oda.

Öröklés

Az OOP-s nyelvekhez hasonlóan itt is le tudunk származni egy ős oszátlyból, az összes különbség a szintaktikában fog megjelenni.

Figyelem!

Más programozási nyelvekkel szemben, itt ténylegesen semmilyen lehetőség és trükk nem áll rendelkezésre, hogy a privát tagokat a leszármatott ösztályban is lássuk!

Ahhoz, hogy az osztályunk leszármazzon egy másikból az extends kulcssóra lesz szükségünk amikor a gyereket definiáljuk, ezt követi az ős osztály megnevezése. Ami fontos elem, hogy a gyermek konstruktorában a super() függvényen keresztül átadjuk az ősnek a hozzá tartozó értékeket.

JavaScript
class Vehicle{
  max_speed;

  constructor(max){
    this.max_speed = speed;
  }
}

class Car extends Vehicle{
  engine_ccm;

  constructor(max,ccm){
    super(max);
    engine_ccm = ccm;
  }

}

Védett tagok

Jelenleg a nyelv nem kezeli a protected tagokat viszont konvencióként kialakult, hogy a _ karakterrel jelzett változókat úgy kezelik, mintha ténylegesen védett lenne. Várhatóan 2024 után fogja a nyelv ténylegesen támogatni.

Osztályok bővítése

Az ES-ben minden osztály rendlekezik egy prototype nevű adattagja. Ezen keresztül tetszőleges példány szintű adattaggal vagy függvénnyel tudjuk a már meglévő osztályokat bővíteni. Ezért vagyunk képesek saját függvényt definiálni például az adatszerkezetekhez is.

Ellenőrző kérdések

  1. Hogyan tudunk konstruktort megadni?
  2. Hogyan veszünk fel privát tagokat?
  3. Lehetnek-e védett tagjai egy osztálynak?
  4. Láthatóak-e az leszármazottban a privát tagok?
  5. Mi a különbség a prototípus és a mixin között?
\pagebreak

A tananyag jelenlegi verziója: 4.0.0