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тин негизги түшүнүктөрүнүн бири болуп саналат, аны түшүнүү тил менен натыйжалуу иштөө үчүн маанилүү.