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.
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é.
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.
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.
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!
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
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.
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
- Hogyan tudunk konstruktort megadni?
- Hogyan veszünk fel privát tagokat?
- Lehetnek-e védett tagjai egy osztálynak?
- Láthatóak-e az leszármazottban a privát tagok?
- Mi a különbség a prototípus és a mixin között?
\pagebreak