Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: prototype chain, property lookup, inheritance, JavaScript object, __proto__

Как происходит поиск свойства по цепочке прототипов?

Вопрос проверяет понимание механизма наследования в JavaScript через прототипы и цепочку их поиска, что необходимо для эффективной работы с объектами и создания иерархий.

Короткий ответ

При попытке получить доступ к свойству объекта, JavaScript сначала ищет его в самом объекте. Если свойство не найдено, поиск продолжается в его прототипе (свойство __proto__), затем в прототипе прототипа и так далее, пока не достигнет конца цепочки (null). Этот механизм обеспечивает наследование свойств и методов. Если свойство не найдено во всей цепочке, возвращается undefined.

Длинный ответ

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

Как работает поиск

Процесс происходит следующим образом:

  1. Движок проверяет, существует ли свойство в самом объекте (его собственные свойства).
  2. Если нет, он переходит к прототипу объекта (через свойство __proto__ или Object.getPrototypeOf()).
  3. Поиск продолжается рекурсивно по цепочке прототипов, пока свойство не будет найдено.
  4. Если конец цепочки достигнут (прототип равен null), возвращается undefined.

Пример кода

Рассмотрим простую иерархию:

// Базовый объект-прототип
const animal = {
  eats: true,
  walk() {
    console.log('Animal walks');
  }
};

// Создаём объект, наследующий от animal
const rabbit = {
  jumps: true,
  __proto__: animal // Устанавливаем прототип
};

// rabbit наследует свойства animal
console.log(rabbit.eats); // true, свойство найдено в прототипе
console.log(rabbit.jumps); // true, собственное свойство
rabbit.walk(); // 'Animal walks', метод найден в прототипе

// Поиск по цепочке: если свойства нет
console.log(rabbit.nonExistent); // undefined, цепочка: rabbit -> animal -> Object.prototype -> null

Где применяется

Цепочка прототипов лежит в основе наследования в JavaScript. Она используется:

  • В классическом прототипном наследовании до появления классов ES6.
  • Встроенные объекты (например, массивы, строки) наследуют методы от своих прототипов (Array.prototype, String.prototype).
  • При создании пользовательских иерархий объектов для повторного использования кода.

Важно понимать, что изменение прототипа динамически влияет на все объекты, которые его наследуют, что может быть как мощным инструментом, так и источником ошибок.

Вывод: Понимание цепочки прототипов необходимо для эффективной работы с объектно-ориентированным программированием в JavaScript, отладки и создания масштабируемых структур кода. Этот механизм особенно полезен при построении иерархий объектов без использования классов.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#prototype chain

#property lookup

#inheritance

#JavaScript object

#__proto__

Подпишись на React Developer в телеграм