Sobes.tech
Middle

Ի՞նչ է JavaScript-ում պրոտոտիպային ժառանգությունը։

sobes.tech AI

Պատասխան AI-ից

JavaScript- ում օբյեկտները ժառանգում են իրենց պրոտոտիպներից հատկություններ և մեթոդներ։ Յուրաքանչյուր օբյեկտի պրոտոտիպը այլ օբյեկտ է, որի հատկությունները և մեթոդները հասանելի են պրոտոտիպային շղթայի միջոցով:

Երբ մուտք ենք գործում օբյեկտի հատկություն, JavaScript-ը նախ փնտրում է այն հենց օբյեկտում։ Եթե չի գտնում, որոնումը շարունակվում է այդ օբյեկտի պրոտոտիպում, ապա պրոտոտիպի պրոտոտիպում և այդպես շարունակ, մինչև հատկությունը գտնվի կամ չհասնի շղթայի վերջը (null):

Պրոտոտիպային ժառանգությունը տարբերվում է դասական ժառանգությունից (օրինակ Java կամ C++), որտեղ օբյեկտները ստեղծվում են այն դասերից, որոնք նկարագրում են նրանց կառուցվածքը և վարքագիծը։ JavaScript-ում, որտեղ ES6-ում հայտնվեցին դասերը, դրանք սինտակսիկ շաքար են պրոտոտիպային ժառանգության վրա:

Հիմնական ասպեկտներ՝

  • __proto__: Օբյեկտի ներքին հատկություն, որը ցույց է տալիս նրա պրոտոտիպին:
  • prototype: Կոնստրուկտորի (ֆունկցիայի, որը օգտագործվում է որպես կոնստրուկտոր) հատկություն, որը ցույց է տալիս օբյեկտին, որը ծառայում է որպես պրոտոտիպ ստեղծվող օրինակների համար:
  • Object.getPrototypeOf(obj): Ստանդարտ միջոց՝ ստանալու օբյեկտի պրոտոտիպը:
  • Object.setPrototypeOf(obj, proto): Ստանդարտ միջոց՝ սահմանելու օբյեկտի պրոտոտիպը:

Օրինակ՝

// Կոնստրուկտորային ֆունկցիա
function Animal(name) {
  this.name = name;
}

// Մեթոդ ավելացնելը Animal-ի պրոտոտիպին
Animal.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
};

// Օբյեկտի օրինակ ստեղծել
const dog = new Animal("Buddy");

// Կոչել պրոտոտիպից մեթոդը
dog.sayHello(); // Ելք՝ Hello, my name is Buddy

// dog-ի պրոտոտիպը՝ Animal.prototype
console.log(Object.getPrototypeOf(dog) === Animal.prototype); // Ելք՝ true

// Animal.prototype-ի պրոտոտիպը՝ Object.prototype
console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // Ելք՝ true

// Պրոտոտիպ շղթայի վերջը՝ null
console.log(Object.getPrototypeOf(Object.prototype) === null); // Ելք՝ true

Համեմատություն դասական ժառանգության հետ (ES6 դասերի օգտագործմամբ)

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); // Հիշեցում՝ ծնողական դասի կոնստրուկտորին
    this.breed = breed;
  }

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

const buddy = new Dog("Buddy", "Golden Retriever");
buddy.sayHello(); // Ելք՝ Hello, my name is Buddy (ներդրված է Animal-ից)
buddy.bark(); // Ելք՝ Woof! (Dog-ի մեթոդ)

// ES6 դասերը շաքար են պրոտոտիպների վրա
console.log(Object.getPrototypeOf(Dog) === Animal); // Ելք՝ true (դերասանների ժառանգություն)
console.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // Ելք՝ true (մեթոդների ժառանգություն պրոտոտիպների միջոցով)
console.log(Object.getPrototypeOf(buddy) === Dog.prototype); // Ելք՝ true (օբյեկտը ժառանգում է դասի պրոտոտիպից)

Պրոտոտիպային ժառանգությունը JavaScript-ի հիմնական հասկացություններից է, որը հասկանալը կարևոր է լեզվի արդյունավետ աշխատանքի համար։