Sobes.tech
Middle

Mis on prototüüp pärimine JavaScriptis?

sobes.tech AI

Vastus AI-lt

JavaScripti objektid pärivad omadusi ja meetodeid oma prototüüpidelt. Iga objekti prototüüp on teine objekt, mille omadused ja meetodid on kättesaadavad prototüüpide ahela kaudu.

Objekti omadusele juurdepääsul otsib JavaScript esmalt seda otse objekti sees. Kui seda ei leita, jätkub otsing objekti prototüüpides, siis prototüübi prototüüpides ja nii edasi, kuni omadus leitakse või jõutakse ahela lõpuni (null).

Prototüüpide pärimine erineb klassikalisest pärimisest (nagu Java või C++), kus objektid luuakse klassidest, mis kirjeldavad nende struktuuri ja käitumist. JavaScriptis, kus ES6-s ilmusid klassid, on need süntaktiline suhkrupulber prototüüpide pärimise üle.

Peamised aspektid:

  • __proto__: Objekti sisemine omadus, mis viitab selle prototüübile.
  • prototype: Konstruktorifunktsiooni (funktsiooni, mida kasutatakse konstruktorina) omadus, mis viitab objekti, mis teenib prototüübina loodavate eksemplaride jaoks.
  • Object.getPrototypeOf(obj): Standardne viis objekti prototüübi saamiseks.
  • Object.setPrototypeOf(obj, proto): Standardne viis objekti prototüübi määramiseks.

Näide:

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

// Lisame meetodi Animal prototüüpi
Animal.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
};

// Loome eksemplari
const dog = new Animal("Buddy");

// Kutsub välja meetodi prototüübist
dog.sayHello(); // Väljund: Hello, my name is Buddy

// Dog objekti prototüüp on Animal.prototype
console.log(Object.getPrototypeOf(dog) === Animal.prototype); // Väljund: true

// Animal.prototype prototüüp on Object.prototype
console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // Väljund: true

// Prototüüpide ahela lõpp on null
console.log(Object.getPrototypeOf(Object.prototype) === null); // Väljund: true

Võrdlus klassikalise pärimisega (kasutades ES6 klasse):

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); // Vanema klassi konstruktorit kutsuma
    this.breed = breed;
  }

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

const buddy = new Dog("Buddy", "Golden Retriever");
buddy.sayHello(); // Väljund: Hello, my name is Buddy (pärib Animalilt)
buddy.bark(); // Väljund: Woof! (Dog meetod)

// ES6 klassid on suhkrupulber prototüüpide üle
console.log(Object.getPrototypeOf(Dog) === Animal); // Väljund: true (klasside pärimine)
console.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // Väljund: true (meetodite pärimine prototüüpide kaudu)
console.log(Object.getPrototypeOf(buddy) === Dog.prototype); // Väljund: true (näide pärib klassi prototüübist)

Prototüüpide pärimine on JavaScripti põhikonseptsioon, mille mõistmine on oluline keele tõhusaks kasutamiseks.