Moștenirea array-urilor
Array-ul reprezintă cea mai simplă modalitate de definire a unui set de date. Cu toate acestea, uneori, capacitățile de bază ale array-urilor pot fi insuficiente. De exemplu, să definim un array care reprezintă o anumită echipă:
const team = ["Tom", "Sam", "Bob"];
for(const person of team) {
console.log(person);
}
Dar ce facem dacă dorim să adăugăm la echipă anumite atribute suplimentare - numele antrenorului, țara sau orașul unde are sediul echipa, numele, sau alte caracteristici? La prima vedere, am putea defini un obiect complex:
const team = {
name: "Barcelona", // denumirea
members: ["Tom", "Sam", "Bob"] // jucători
};
for(const person of team.members) {
console.log(person);
}
Dar există și o altă soluție, care ne permite să definim propriul tip de colecție: să creăm propria clasă, care va fi moștenită din Array.
class Team extends Array{
constructor(name, ...members){
super(...members);
this.name = name;
}
}
Aici presupunem că numele echipei este primul parametru al constructorului clasei, iar al doilea parametru reprezintă lista de jucători a echipei, numărul cărora nu este fix.
Datorită moștenirii din Array, putem trata obiectele clasei Team ca seturi de date și putem aplica asupra lor toate operațiile care se aplică array-urilor:
class Team extends Array{
constructor(name, ...members){
super(...members);
this.name = name;
}
}
// creăm obiectul echipei
const barcelona = new Team("Barcelona", "Tom", "Sam", "Bob");
console.log(barcelona); // Team(3) ["Tom", "Sam", "Bob"]
// parcurgere set
for(const person of barcelona) {
console.log(person);
}
barcelona.push("Tim"); // adăugăm un element
console.log(barcelona); // Team(4) ["Tom", "Sam", "Bob", "Tim"]
barcelona.splice(1, 1); // ștergem al doilea element
console.log(barcelona); // Team(3) ["Tom", "Bob", "Tim"]
Suprascrierea metodelor
La fel ca în moștenire, putem să suprascriem metodele moștenite. De exemplu, vom suprascrie comportamentul metodei push(), care este responsabilă pentru adăugarea la sfârșitul array-ului:
class Team extends Array{
constructor(name, ...members){
super(...members);
this.name = name;
}
push(person){
if(person !== "admin") super.push(person);
}
}
const snowbars = new Team("SnowBars", "Tom", "Sam", "Bob");
snowbars.push("admin"); // adăugăm un element - admin
console.log(snowbars); // Team(3) ["Tom", "Sam", "Bob"]
snowbars.push("Tim"); // adăugăm un element - Tim
console.log(snowbars); // Team(4) ["Tom", "Sam", "Bob", "Tim"]
În acest caz, dacă în metodă este transmis orice nume, în afară de "admin", atunci acesta este adăugat la echipă.