JavaScriptте мурасым кандай иштээрин түшүндүрүңүз.
sobes.tech AI
AIден жооп
JavaScriptте мурас берүү прототиптер аркылуу ишке ашырылат. JavaScriptте ар бир объекттин ички өзгөчөлүгү [[Prototype]] бар жана ал башка бир объектке шилтеме кылат. Биз объекттин өзүндө түздөн-түз жок болгон мүнөзөткө же ыкмага кирүү аракетин жасаганда, JavaScript мотору бул мүнөзөттү же ыкманы ошол объекттин прототипинен издейт. Эгер ал таппаса, издөө прототиптердин чынжырында улантылат, ал [[Prototype]] байланышы аркылуу түзүлүп, null-га (чынжырдын акыркы учу) жеткенге чейин.
Иргиликке ээ болуу үчүн эки негизги механизм бар:
-
Классикалык прототиптик мурас (ES5 жана мурда): Бул функция-конструкторлорду жана алардын
prototypeкасиеттерин колдонууга негизделген.// Конструктор функциясы function Жаныбар(аты) { this.аты = аты; } // Прототипке метод кошуу Жаныбар.prototype сүйлөө = function() { console.log(`${this.аты} үн чыгарат.`); }; // Мисал түзүү const ит = new Жаныбар('Ит'); // Прототиптен метод чакыруу ит.sүйлөө(); // Чыгуу: Ит үн чыгарат. // `dog` прототипи `Жаныбар.prototype` console.log(Object.getPrototypeOf(ит) === Жаныбар.prototype); // true -
Класстык мурас (ES6 жана андан кийинки): Бул
classжанаextendsсинтаксиси аркылуу ишке ашат, ал дагы эле прототиптер менен иштейт.// Негизги класс class Жаныбар { constructor(аты) { this.аты = аты; } сүйлөө() { console.log(`${this.аты} үн чыгарат.`); } } // Төмөнкү класс, Жаныбардан мурас алат class Ит extends Жаныбар { constructor(аты, тукумдар) { super(аты); // Ата класс конструкторун чакыруу this.тукумдар = тукумдар; } үрүү() { console.log(`${this.аты} үрөйт.`); } } // Мисал түзүү const менинИтим = new Ит('Bublik', ['Labrador', 'Collie']); // Методторду чакыруу менинИтим.сүйлөө(); // Чыгуу: Bublik үн чыгарат. менинИтим.үрүү(); // Чыгуу: Bublik үрөйт. // `Ит.prototype` прототипи `Жаныбар.prototype` console.log(Object.getPrototypeOf(менинИтим) === Ит.prototype); // true // `Ит.prototype` прототипи `Жаныбар.prototype` console.log(Object.getPrototypeOf(Ит.prototype) === Жаныбар.prototype); // true
Негизги түшүнүктөр:
-
Прототиптер чынжыры: Объекттердин ортосундагы байланыс
[[Prototype]]аркылуу. -
__proto__(эскирген/стандарт эмес, бирок түшүнүү үчүн пайдалуу): Бул мүлүк аркылуу[[Prototype]]га жетүүгө болот. Өндүрүш кодуна колдонуу сунушталбайт. -
Object.getPrototypeOf(obj): Объекттин прототипин алуу үчүн стандарттык ыкма. -
Object.setPrototypeOf(obj, proto): Объекттин прототипин өзгөртүү үчүн стандарттык ыкма (бардык түзүлгөн объекттердин прототипин өзгөртүү сунушталбайт). -
instanceof: Объекттин класс же конструктор функциясынын үлгүсү экенин текшерүү үчүн оператор, анын прототиптер чынжыры аркылуу:console.log(менинИтим instanceof Ит); // true console.log(менинИтим instanceof Жаныбар); // true console.log(менинИтим instanceof Object); // true (чынжырдын акырында `Object.prototype`) -
super: Класстарда ата-эненин методдорун же конструкторун чакырууга колдонулат.
Классикалык жана класссыз ыкмалардын айырмасы: Класстар прототиптик мурас менен иштөөнү структуралаштырылган жана синтаксиси жагынан ыңгайлуу кылган жолду сунуштайт, башка программалоо тилдерине жакын. Бирок негизги механизм ошол бойдон калууда — прототиптер аркылуу мурас.