Sobes.tech
Middle

Kas yra prototipinis paveldėjimas JavaScript?

sobes.tech AI

Atsakymas iš AI

JavaScript objektai paveldi savybes ir metodus iš savo prototipų. Kiekvieno objekto prototipas yra kitas objektas, kurio savybės ir metodai yra pasiekiami per prototipų grandinę.

Prieš pasiekiant objekto savybę, JavaScript pirmiausia jos ieško tiesiogiai objekte. Jei neranda, paieška tęsiasi prototipe, tada prototipo prototipe ir taip toliau, kol savybė bus rasta arba pasieks grandinės pabaigą (null).

Prototipinis paveldėjimas skiriasi nuo klasikinio paveldėjimo (kaip Java ar C++), kur objektai kuriami iš klasių, aprašančių jų struktūrą ir elgesį. JavaScript, kur ES6 atsirado klasės, yra sintaksinis cukrus virš prototipinio paveldėjimo.

Pagrindiniai aspektai:

  • __proto__: Objekto vidinis savybė, nurodanti jo prototipą.
  • prototype: Konstruktorio (funkcijos, naudojamos kaip konstruktorius) savybė, nurodanti objektą, kuris bus prototipas kuriamiems egzemplioriams.
  • Object.getPrototypeOf(obj): Standartinis būdas gauti objekto prototipą.
  • Object.setPrototypeOf(obj, proto): Standartinis būdas nustatyti objekto prototipą.

Pavyzdys:

// Konstruktorinė funkcija
function Animal(name) {
  this.name = name;
}

// Pridedame metodą prie Animal prototipo
Animal.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
};

// Sukuriame egzempliorių
const dog = new Animal("Buddy");

// Iškviečiame metodą iš prototipo
dog.sayHello(); // Išvestis: Hello, my name is Buddy

// Dog objekto prototipas yra Animal.prototype
console.log(Object.getPrototypeOf(dog) === Animal.prototype); // Išvestis: true

// Animal.prototype prototipas yra Object.prototype
console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // Išvestis: true

// Pabaiga prototipų grandinėje yra null
console.log(Object.getPrototypeOf(Object.prototype) === null); // Išvestis: true

Palyginimas su klasikinio paveldėjimo (naudojant 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); // Tėvų klasės konstruktoriaus iškvietimas
    this.breed = breed;
  }

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

const buddy = new Dog("Buddy", "Golden Retriever");
buddy.sayHello(); // Išvestis: Hello, my name is Buddy (paveldi iš Animal)
buddy.bark(); // Išvestis: Woof! (Dog metodas)

// ES6 klasės yra cukrus virš prototipų
console.log(Object.getPrototypeOf(Dog) === Animal); // Išvestis: true (paveldėjimas tarp klasių)
console.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // Išvestis: true (paveldėjimas metodų per prototipus)
console.log(Object.getPrototypeOf(buddy) === Dog.prototype); // Išvestis: true (egzempliorius paveldi iš klasės prototipo)

Prototipinis paveldėjimas yra pagrindinė JavaScript koncepcija, kurios supratimas yra būtinas efektyviam kalbos naudojimui.