Sobes.tech
Junior

JavaScriptте мурасым кандай иштээрин түшүндүрүңүз.

sobes.tech AI

AIден жооп

JavaScriptте мурас берүү прототиптер аркылуу ишке ашырылат. JavaScriptте ар бир объекттин ички өзгөчөлүгү [[Prototype]] бар жана ал башка бир объектке шилтеме кылат. Биз объекттин өзүндө түздөн-түз жок болгон мүнөзөткө же ыкмага кирүү аракетин жасаганда, JavaScript мотору бул мүнөзөттү же ыкманы ошол объекттин прототипинен издейт. Эгер ал таппаса, издөө прототиптердин чынжырында улантылат, ал [[Prototype]] байланышы аркылуу түзүлүп, null-га (чынжырдын акыркы учу) жеткенге чейин.

Иргиликке ээ болуу үчүн эки негизги механизм бар:

  1. Классикалык прототиптик мурас (ES5 жана мурда): Бул функция-конструкторлорду жана алардын prototype касиеттерин колдонууга негизделген.

    // Конструктор функциясы
    function Жаныбар(аты) {
      this.аты = аты;
    }
    
    // Прототипке метод кошуу
    Жаныбар.prototype сүйлөө = function() {
      console.log(`${this.аты} үн чыгарат.`);
    };
    
    // Мисал түзүү
    const ит = new Жаныбар('Ит');
    
    // Прототиптен метод чакыруу
    ит.sүйлөө(); // Чыгуу: Ит үн чыгарат.
    
    // `dog` прототипи `Жаныбар.prototype`
    console.log(Object.getPrototypeOf(ит) === Жаныбар.prototype); // true
    
  2. Класстык мурас (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: Класстарда ата-эненин методдорун же конструкторун чакырууга колдонулат.

Классикалык жана класссыз ыкмалардын айырмасы: Класстар прототиптик мурас менен иштөөнү структуралаштырылган жана синтаксиси жагынан ыңгайлуу кылган жолду сунуштайт, башка программалоо тилдерине жакын. Бирок негизги механизм ошол бойдон калууда — прототиптер аркылуу мурас.