Ի՞նչ է 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-ի հիմնական հասկացություններից է, որը հասկանալը կարևոր է լեզվի արդյունավետ աշխատանքի համար։