Sobes.tech
Junior

Izskaidrojiet, kā darbojas mantošana JavaScript.

sobes.tech AI

Atbilde no AI

JavaScript mantošana balstās uz prototipiem. Katram objektam ir iekšēja īpašība [[Prototype]] (pieejama caur __proto__ vai Object.getPrototypeOf()), kas norāda uz citu objektu.

Mēģinot piekļūt objekta īpašībai vai metodei, ja tā nav tieši objektā, JavaScript to meklē [[Prototype]] šim objektam, pēc tam [[Prototype]] prototipam un tālāk pa prototipu ķēdi, līdz sasniedz beigas (Object.prototype), kura [[Prototype]] ir null.

Tas ir prototipu mantošana.

ECMAScript 2015 (ES6) klases ir sintaktisks cukurs virs prototipu mantošanas. Tās nodrošina ērtāku sintaksi darbam ar prototipiem un objektu hierarhijām.

Piemērs, kā izmantot prototipu mantošanu pirms ES6:

// Vecāku konstruktoru
function Animal(name) {
  this.name = name;
}

// Vecāka metode prototipā
Animal.prototype.sayHi = function() {
  console.log(`Sveiki, esmu ${this.name}`);
};

// Bērna konstruktoru
function Dog(name, breed) {
  // Izsauc vecāka konstruktoru
  Animal.call(this, name);
  this.breed = breed;
}

// Iestatām bērna prototipu kā vecāka prototipa kopiju
// Saglabājam atsauci uz Dog konstruktoru
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

// Pievienojam metodi bērnam
Dog.prototype.bark = function() {
  console.log("Gav-gav!");
};

// Izveidojam bērna instanci
const myDog = new Dog("Bobi", "Labradoras retrīvers");

// Izmantojam vecāka un bērna metodes
myDog.sayHi(); // Izvada: Sveiki, esmu Bobi
myDog.bark();  // Izvada: Gav-gav!

ES6 klases piemērs:

// Vecāku klase
class Animal {
  constructor(name) {
    this.name = name;
  }

  sayHi() {
    console.log(`Sveiki, esmu ${this.name}`);
  }
}

// Bērna klase, kas manto no Animal
class Dog extends Animal {
  constructor(name, breed) {
    super(name); // Izsauc vecāka konstruktoru
    this.breed = breed;
  }

  bark() {
    console.log("Gav-gav!");
  }
}

// Izveidojam bērna klases instanci
const myDog = new Dog("Reksis", "Vācijas aitu suns");

// Izmantojam vecāka un bērna metodes
myDog.sayHi(); // Izvada: Sveiki, esmu Reksis
myDog.bark();  // Izvada: Gav-gav!

Galvenie JavaScript mantošanas punkti:

  • Prototipi: Katram objektam ir prototips.
  • Prototipu ķēde: Meklējot īpašību vai metodi, tā tiek meklēta augšup pa ķēdi.
  • [[Prototype]]: Iekšējā īpašība, kas norāda uz prototipu.
  • __proto__: Vecāks, bet bieži lietots veids, kā piekļūt [[Prototype]].
  • Object.getPrototypeOf(): Ieteicamais veids, kā piekļūt [[Prototype]].
  • Konstruktori un prototype: Pirms ES6 tika izmantoti objektu izveidei un prototipu iestatīšanai.
  • Klases (ES6): sintaktisks cukurs prototipu mantošanai, izmantojot class, extends, super vārdus.