Sobes.tech
Junior

გთხოვთ, ახსნათ, როგორ მუშაობს მემკვიდრეობა JavaScript-ში.

sobes.tech AI

პასუხი AI-სგან

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

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

Бул прототиптик мурас алуу.

ECMAScript 2015 (ES6) класстары прототиптик мурас алуунун синтаксистик шекерлери болуп саналат. Алар прототиптер менен иштөө жана объекттердин иерархияларын түзүү үчүн көбүрөөк ыңгайлуу синтаксисти камсыз кылат.

ES6 алдында прототиптик мурас алуу мисалы:

// Ата-эне конструктору
function Animal(name) {
  this.name = name;
}

// Ата-эне методу прототипте
Animal.prototype.sayHi = function() {
  console.log(`Салам, мен ${this.name}`);
};

// Төменкү конструктор
function Dog(name, breed) {
  // Ата-эне конструкторун чакырабыз
  Animal.call(this, name);
  this.breed = breed;
}

// Төменкү прототипти ата-эне прототипине орнотобуз
// Dog конструкторуна шилтемени сактайбыз
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

// Төменкү методу
Dog.prototype.bark = function() {
  console.log("Гав-гав!");
};

// Төменкү экземпляр түзөбүз
const myDog = new Dog("Бобик", "Лабрадор");

// Ата-эне жана төмөнкү методдорду колдонуу
myDog.sayHi(); // Чыгарышы: Салам, мен Бобик
myDog.bark();  // Чыгарышы: Гав-гав!

ES6 класстарынын мисалы:

// Ата-эне класс
class Animal {
  constructor(name) {
    this.name = name;
  }

  sayHi() {
    console.log(`Салам, мен ${this.name}`);
  }
}

// Төменкү класс, Animalдан мурас алат
class Dog extends Animal {
  constructor(name, breed) {
    super(name); // Ата-эне конструкторун чакырабыз
    this.breed = breed;
  }

  bark() {
    console.log("Гав-гав!");
  }
}

// Төменкү класс экземплярын түзөбүз
const myDog = new Dog("Рекс", "Немис овчарка");

// Ата-эне жана төмөнкү методдорду колдонуу
myDog.sayHi(); // Чыгарышы: Салам, мен Рекс
myDog.bark();  // Чыгарышы: Гав-гав!

JavaScriptте мурас алуунун негизги пункттары:

  • Прототиптер: Ар бир объекттин прототипи бар.
  • Прототиптердин чынжыры: Өзгөчөлүк же метод издегенде, прототиптер жогору карай каралат.
  • [[Prototype]]: Внутреннее свойство, которое указывает на прототип.
  • __proto__: устаревший, но часто используемый способ доступа к [[Prototype]].
  • Object.getPrototypeOf(): рекомендуемый способ доступа к [[Prototype]].
  • Конструкторы и prototype: До ES6 использовались для создания объектов и установки их прототипов.
  • Классы (ES6): синтаксический сахар для прототипного наследования, использующий ключевые слова class, extends, super.