Sobes.tech
Middle

Какви са прототипите в JavaScript?

sobes.tech AI

Отговор от AI

В JavaScript обектите могат да наследяват свойства и методи от други обекти чрез механизма на прототипите. Всеки обект в JavaScript има вътрешно скрито свойство [[Prototype]], което сочи към друг обект, неговият прототип. Когато се достъпва до свойство или метод на обект, JavaScript първо го търси в самия обект. Ако не го намери, проверява свойството [[Prototype]] и търси в прототипа. Този процес се повтаря по веригата на прототипите, докато свойството не бъде намерено или не достигне null (краят на веригата).

Основни концепции:

  • Верига на прототипи: Последователност от обекти, свързани чрез свойството [[Prototype]].
  • Наследяване: Обектите наследяват свойства и методи от своите прототипи.
  • __proto__: Исторически използвано (макар и не стандартизирано първоначално) свойство за достъп до [[Prototype]]. В днешно време се препоръчва използването на Object.getPrototypeOf().
  • prototype: Свойство на конструктора, към което сочи [[Prototype]] в създадените с него обекти.

Пример с конструктор и прототип:

// Конструктор
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// Добавяне на метод към прототипа
Person.prototype.sayHello = function() {
  console.log("Здравейте, казвам се " + this.name);
};

// Създаване на екземпляр
const person1 = new Person("Alice", 30);

// Викаме метода от прототипа
person1.sayHello(); // Изход: Здравейте, казвам се Alice

// Достъп до прототипа на екземпляра
console.log(Object.getPrototypeOf(person1) === Person.prototype); // Изход: true

В този пример:

  • Person е конструкторска функция.
  • Person.prototype е обектът, който служи като прототип за всички екземпляри, създадени с new Person().
  • sayHello е метод, добавен към прототипа. Всички екземпляри на Person наследяват този метод.
  • Когато се извика person1.sayHello(), JavaScript моторът търси sayHello в person1. Ако не го намери, се обръща към [[Prototype]] на person1 (който е равен на Person.prototype) и намира метода там.

Прототипите осигуряват ефективно използване на паметта, тъй като методите и общите свойства се съхраняват в прототипа, а не се дублират във всеки обект.