Sobes.tech
Junior

Selgitage, kuidas töötab pärimine JavaScriptis.

sobes.tech AI

Vastus AI-lt

JavaScript mantošana tiek īstenota caur prototipiem. Katram objektam JavaScript iekšēji ir īpašība [[Prototype]], kas norāda uz citu objektu. Kui mēģinām piekļūt objekta īpašībai vai metodēm, kas 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:

  1. 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
    
  2. Klasiskā mantošana (ES6 un vēlāk): izmanto sintakses cukuru class un extends, 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.