Sobes.tech
Middle

Milline on erinevus JavaScriptis objektorienteeritud programmeerimise ja teiste programmeerimiskeelte OOP vahel?

sobes.tech AI

Vastus AI-lt

JavaScript kasutab prototüüpset pärandamist klasside asemel.

Klassikeeltes on objektid klasside eksemplarid, mis kirjeldavad nende struktuuri ja käitumist. Pärandamine toimub olemasolevate klasside laiendamise kaudu.

JavaScriptis klassid traditsioonilises mõttes puuduvad. Objekte luuakse otse või teiste prototüüpobjektide põhjal. Pärandamine realiseerub prototüüpide ahelas, kus igal objektil on viide oma "vanem"-prototüübile. Kui pääseb ligi objekti omadusele või meetodile, otsib JavaScript esmalt objekti seest, siis selle prototüübist, seejärel prototüübi prototüübist ja nii edasi.

Näide objekti loomise ja pärandamise kohta JavaScriptis:

// Prototüüpobjekti loomine
const animal = {
  speak() {
    console.log('Üldine hääl');
  }
};

// Objekti loomine prototüübi põhjal
const dog = Object.create(animal);

// Meetodi üle kirjutamine uuele objektile
dog.speak = function() {
  console.log('Vau!');
};

dog.speak(); // Väljund "Vau!"

Klassi ja prototüüpse OOP võrdlus:

Omadus Klassipõhine OOP (Java, C++) Prototüüpne OOP (JavaScript)
Põhimõte Klassid ja nende eksemplarid Objekid ja prototüübid
Pärandamine Pärandamine 'extends'-i kaudu Pärandamine prototüüpide ahelas
Objekti loomine 'new' ja konstruktorite abil Otse, Object.create(), konstruktorid (funktsioonid)
Polümorfism Meetodite üle kirjutamisega klassides Sisu ja meetodite üle kirjutamisega objektides
Inkapsulatsioon Ligipääsuklassid (public, private, protected) Kokkulepped ja sulgud (closures)

ECMAScript 2015 (ES6) klasside kasutuselevõtt lisas süntaktilise suhkrupaki, mis põhineb prototüüpse pärandi peal, muutes JavaScripti OOP sarnasemaks klassipõhiste keeltele, kuid põhimõte jääb prototüüpseks.

// Näide ES6 klasside kasutamisest
class Animal {
  speak() {
    console.log('Üldine hääl');
  }
}

class Dog extends Animal {
  speak() {
    console.log('Vau!');
  }
}

const myDog = new Dog();
myDog.speak(); // Väljund "Vau!"