Sobes.tech
Middle

Kas ir prototipiskā mantošana JavaScript?

sobes.tech AI

Atbilde no AI

JavaScript objekti manto īpašības un metodes no to prototipiem. Katram objekta prototips ir cits objekts, kura īpašības un metodes ir pieejamas caur prototipu ķēdi.

Pieejot objekta īpašībai, JavaScript vispirms meklē to tieši pašā objektā. Ja tā nav atrasta, meklē prototipā, tad prototipa prototipā un tā tālāk, līdz īpašība tiek atrasta vai tiek sasniegta ķēdes beigas (null).

Prototipu mantošana atšķiras no klasiskās mantošanas (kā Java vai C++), kur objekti tiek veidoti no klasēm, kas apraksta to struktūru un uzvedību. JavaScript, kur ES6 parādījās klases, ir sintaktisks cukurs virs prototipu mantošanas.

Galvenie aspekti:

  • __proto__: Objekta iekšējā īpašība, kas norāda uz tā prototipu.
  • prototype: Konstruktoru (funkciju, kas tiek izmantota kā konstruktors) īpašība, kas norāda uz objektu, kas kalpos kā prototips radītajiem eksemplāriem.
  • Object.getPrototypeOf(obj): Standarta veids, kā iegūt objekta prototipu.
  • Object.setPrototypeOf(obj, proto): Standarta veids, kā iestatīt objekta prototipu.

Piemērs:

// Konstruktorfunkcija
function Animal(name) {
  this.name = name;
}

// Pievienojam metodi Animal prototipam
Animal.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
};

// Izveidojam eksemplāru
const dog = new Animal("Buddy");

// Izsaucam metodi no prototipa
dog.sayHello(); // Izvade: Hello, my name is Buddy

// Dog objekta prototips ir Animal.prototype
console.log(Object.getPrototypeOf(dog) === Animal.prototype); // Izvade: true

// Animal.prototype prototips ir Object.prototype
console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // Izvade: true

// Prototipu ķēdes beigas ir null
console.log(Object.getPrototypeOf(Object.prototype) === null); // Izvade: true

Salīdzinājums ar klasisko mantošanu (izmantojot ES6 klases):

class Animal {
  constructor(name) {
    this.name = name;
  }

  sayHello() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

class Dog extends Animal {
  constructor(name, breed) {
    super(name); // Izsauc vecāku klases konstruktoru
    this.breed = breed;
  }

  bark() {
    console.log("Woof!");
  }
}

const buddy = new Dog("Buddy", "Golden Retriever");
buddy.sayHello(); // Izvade: Hello, my name is Buddy (manto no Animal)
buddy.bark(); // Izvade: Woof! (Dog metode)

// ES6 klases ir cukurs virs prototipiem
console.log(Object.getPrototypeOf(Dog) === Animal); // Izvade: true (mantošana starp klasēm)
console.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // Izvade: true (mantošana metožu caur prototipiem)
console.log(Object.getPrototypeOf(buddy) === Dog.prototype); // Izvade: true (instancē manto no klases prototipa)

Prototipu mantošana ir galvenā JavaScript koncepcija, kuras saprašana ir būtiska efektīvai valodas izmantošanai.