Что такое прототипное наследование

Прототипное наследование — это механизм, с помощью которого объекты могут наследовать свойства и методы от других объектов. Это одна из основных особенностей языка JavaScript, отличающая его от классических моделей наследования, используемых во многих других языках программирования.

Как это работает

Каждый объект имеет специальное скрытое свойство `[[Prototype]]` (как правило, доступное как `__proto__` или через `Object.getPrototypeOf()`), которое ссылается на другой объект — его прототип. Когда вы пытаетесь получить доступ к свойству или методу объекта, и это свойство/метод не найдено в самом объекте, поиск продолжается по цепочке прототипов, пока свойство/метод не будет найден или не будет достигнут конец цепочки прототипов (прототип `null`).

Пример:

let animal = {
  eats: true,
  walk() {
    console.log("Animal walk");
  }
};

let rabbit = {
  jumps: true,
  __proto__: animal
};

rabbit.walk(); // Animal walk
console.log(rabbit.eats); // true

В этом примере объект `rabbit` наследует свойство `eats` и метод `walk` от объекта `animal` через прототипную цепочку.

Основные принципы

  • Прототипная цепочка: Когда вы обращаетесь к свойству объекта, автоматически ищет это свойство в объекте, а затем — в его прототипах, пока не достигнет конца цепочки прототипов.
  • `Object.prototype`: В вершине прототипной цепочки находится `Object.prototype`. Он не имеет прототипа и содержит методы, доступные всем объектам, такие как `toString()`, `hasOwnProperty()` и другие.
  • Создание объектов с определённым прототипом: Для создания объектов с указанием прототипа можно использовать `Object.create(proto)`, где `proto` — объект, который должен стать прототипом для нового объекта.

Отличия от классического наследования

В отличие от него, прототипное наследование не использует классы как таковые (до введения `class` в ES6, которые являются "синтаксическим сахаром" над прототипным наследованием). Вместо этого объекты напрямую наследуют свойства и методы от других объектов.

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

Feb. 26, 2024, easyoffer