Kuo skiriasi objektinio programavimo JavaScript ir kitų programavimo kalbų OOP?
sobes.tech AI
Atsakymas iš AI
JavaScript naudoja prototipinį paveldėjimą vietoj klasės.
Klasiniuose kalbose objektai yra klasių pavyzdžiai, aprašantys jų struktūrą ir elgesį. Paveldėjimas vyksta išplečiant esamas klases.
JavaScript'e klasės tradiciniame supratime neegzistuoja. Objektai kuriami tiesiogiai arba remiantis kitais prototipiniais objektais. Paveldėjimas įgyvendinamas per prototipų grandinę, kur kiekvienas objektas turi nuorodą į savo "tėvų" prototipą. Kai prieinama prie objekto savybės ar metodo, JavaScript pirmiausia ieško jos pačiame objekte, tada jo prototipe, tada prototipo prototipe ir taip toliau grandinėje.
Pavyzdys, kaip kurti objektą ir paveldėjimą JavaScript:
// Prototipinio objekto kūrimas
const animal = {
speak() {
console.log('Bendras garsas');
}
};
// Objekto kūrimas remiantis prototipu
const dog = Object.create(animal);
// Perrašyti metodą naujam objektui
dog.speak = function() {
console.log('Au!');
};
dog.speak(); // Išves "Au!"
Klasės ir prototipinio OOP palyginimas:
| Savybė | Klasės OOP (Java, C++) | Prototipinis OOP (JavaScript) |
|---|---|---|
| Pagrindinis mechanizmas | Klasės ir jų pavyzdžiai | Objektai ir prototipai |
| Paveldėjimas | Paveldėjimas naudojant 'extends' | Paveldėjimas per prototipų grandinę |
| Objekto kūrimas | Naudojant 'new' ir konstruktorius | Tiesiogiai, Object.create(), konstruktoriai (funkcijos) |
| Polimorfizmas | Per metodų perrašymą klasėse | Per savybių ir metodų perrašymą objektuose |
| Inkapsuliacija | Prieigos modifikatoriai (public, private, protected) | Sutarimai ir uždarymai (closures) |
Įvedus klases ECMAScript 2015 (ES6), buvo pridėtas sintaksinis cukrus, viršijantis prototipinį paveldėjimą, padarant JavaScript OOP panašesnį į klasių kalbas, bet pagrindinis mechanizmas lieka prototipinis.
// Pavyzdys naudojant klases ES6
class Animal {
speak() {
console.log('Bendras garsas');
}
}
class Dog extends Animal {
speak() {
console.log('Vau!');
}
}
const myDog = new Dog();
myDog.speak(); // Išves "Vau!"