Skaidrojiet, kā darbojas mantošana JavaScript.
sobes.tech AI
Atbilde no AI
JavaScript manto inheritance tiek īstenots caur prototipiem. Katrs objekts JavaScript ir iekšējo īpašību [[Prototype]], kas norāda uz citu objektu. Kad mēģinām piekļūt objekta īpašībai vai metodēm, kuras tieši nav pieejamas, JavaScript dzinējs meklē šo īpašību vai metodi šī objekta prototipā. Ja tas tur netiek atrasts, tas turpina meklēt prototipu ķēdē, kas sastāv no [[Prototype]] saitēm, līdz sasniedz null (ķēdes beigas).
Ir divi galvenie mantošanas mehānismi:
-
Klasiskā prototipiskā mantošana (ES5 un agrāk): balstīta uz funkciju konstruktoriem un to
prototypeīpašību.// Konstruktora funkcija function Animal(name) { this.name = name; } // Metodes pievienošana prototipam Animal.prototype.speak = function() { console.log(`${this.name} izdala skaņu.`); }; // Objekta izveide const dog = new Animal('Suns'); // Izsauc prototipa metodi dog.speak(); // Izvadīs: Suns izdala skaņu. // Prototips - tas ir Animal.prototype console.log(Object.getPrototypeOf(dog) === Animal.prototype); // true -
Klasiskā mantošana (ES6 un vēlāk): izmanto sintakses cukuru
classunextends, kas zem virsmas joprojām darbojas ar prototipiem.// Bāzes klase class Animal { constructor(name) { this.name = name; } speak() { console.log(`${this.name} izdala skaņu.`); } } // Apakšklase, kas manto no Animal class Dog extends Animal { constructor(name, breeds) { super(name); // Izsauc vecā klases konstruktoru this.breeds = breeds; } bark() { console.log(`${this.name} rej.`); } } // Objekta izveide no apakšklases const myDog = new Dog('Bublik', ['Labrador', 'Collie']); // Metodes no Animal un Dog myDog.speak(); // Izvadīs: Bublik izdala skaņu. myDog.bark(); // Izvadīs: Bublik rej. // myDog prototips - tas ir Dog.prototype console.log(Object.getPrototypeOf(myDog) === Dog.prototype); // true // Dog.prototype prototips - tas ir Animal.prototype console.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // true
Galvenās koncepcijas:
-
Prototipu ķēde: saikne starp objektiem caur to
[[Prototype]]. -
__proto__(novecojis/neoficiāls, bet noderīgs sapratnei): īpašība, caur kuru var piekļūt pie[[Prototype]]. Nav ieteicams lietot ražošanas kodā. -
Object.getPrototypeOf(obj): standarta veids, kā iegūt objekta prototipu. -
Object.setPrototypeOf(obj, proto): standarta veids, kā mainīt objekta prototipu (nav ieteicams mainīt prototipu jau izveidotiem objektiem pēc to izveides). -
instanceof: operators, kas pārbauda, vai objekts ir klases vai konstruktora funkcijas instances, pārbaudot tā prototipu ķēdi.console.log(myDog instanceof Dog); // true console.log(myDog instanceof Animal); // true console.log(myDog instanceof Object); // true (beigu galā Object.prototype) -
super: izmanto klasēs, lai izsauktu vecāku klases metodes vai konstruktoru.
Atšķirība starp klasisko un klases pieeju: klases nodrošina strukturētāku un sintaktiski ērtāku veidu, kā strādāt ar prototipu mantošanu, kas ir līdzīga citām programmēšanas valodām. Tomēr pamatmehānisms paliek tas pats — mantošana caur prototipiem.