Sobes.tech
Middle

JavaScript-дегі сыныптар мен басқа бағдарламалау тілдеріндегі сыныптар арасындағы айырмашылық неде?

sobes.tech AI

AI-дан жауап

JavaScript-те сыныптар — прототиптік мұрагерліктің синтаксистік қақпағы. Басқа тілдерде, мысалы, Java немесе C++, сыныптар тип жүйесінің негізгі бөлігі болып табылады және классикалық мұрагерлікке негізделген, онда объектілер сыныптардың экземплярлары болып табылады.

Негізгі айырмашылықтар:

Ерекшелік JavaScript (Сыныптар) Классикалық Тілдер (Сыныптар)
Мұрагерлік моделі Прототиптік (прототиптік тізбектегі делегация) Классикалық (ата-ана сыныптарының қасиеттері мен әдістерін мұрагерлікке алу)
Объектілерді құру new немесе фабрика функциялары арқылы (имитация) new арқылы сынып анықтамасынан негізделген
Қасиеттер Экземплярға динамикалық түрде қосылуы мүмкін Сыныпта анықталады, экземплярлар әдепкі бойынша оларды иеленеді
"Қорғау" деректер Синтаксистік деңгейде қатаң жеке қасиеттер жоқ Қолжетімділік модификаторларын қолдау (private, protected, public)
"Сыныптар" Функция-конструкторлар прототиппен бірге Тілдің бөлек тұжырымдамалары

JS-те сыныптар объектілермен жұмыс істеу және мұрагерлікті қолдануда дәстүрлі синтаксисті ұсынады, бірақ астарында бәрі прототиптермен жұмыс істейді. Мысалы, экземплярдан қасиетті алуға тырысқанда, JS қозғалтқышы алдымен экземплярды, содан кейін оның прототипін, содан кейін прототип прототипін қарайды және осылайша тізбектеледі.

// JavaScript-те мысал
class Animal {
  constructor(name) {
    this.name = name;
  }

  speak() {
    console.log(`${this.name} дыбыс шығарады.`);
  }
}

class Dog extends Animal {
  speak() {
    console.log(`${this.name} үриді.`);
  }
}

const myDog = new Dog('Buddy');
myDog.speak(); // Прототиптік мұрагерлік: speak әдісі Dog прототипінде, содан кейін Animal прототипінде табылды

// Қасиетті динамикалық түрде қосу
myDog.age = 3;
console.log(myDog.age);
// Java-да мысал (салыстыру үшін)
class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    public void speak() {
        System.out.println(name + " дыбыс шығарады.");
    }
}

class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    @Override
    public void speak() {
        System.out.println(name + " үрді.");
    }
}

// Экземплярды құру
Dog myDog = new Dog("Buddy");
myDog.speak(); // Классикалық мұрагерлік: speak әдісі Animal-дан мұрагерлікке алынып, Dog-да қайта анықталды

// Динамикалық қасиетті қосу мүмкін емес, егер ол сыныпта анықталмаса
// myDog.age = 3; // Компиляция қатесі

Көптеген классикалық тілдерден айырмашылығы, сыныптар объектілердің қатаң құрылымын анықтаса да, JS-те сыныптардың экземплярлары "икемді" болып табылады және қасиеттер мен әдістерді динамикалық түрде қосуға немесе жоюға мүмкіндік береді, дегенмен бұл тәсіл жиі антипаттерн болып табылады. JS-те жеке өрістер кейінірек енгізілді және # таңбасы синтаксисін пайдаланады, бұл private, protected және public кілт сөздерінен ерекшеленеді.