Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: prototype, constructor function, inheritance, JavaScript, object-oriented programming

В чем разница между свойствами функции и свойствами её prototype?

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

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

Свойства, добавленные непосредственно к функции-конструктору, являются статическими и принадлежат самой функции как объекту, они не наследуются экземплярами. Свойства, добавленные в объект prototype функции, являются общими для всех экземпляров, созданных через new, и составляют основу цепочки прототипов. Например, Array.isArray — статический метод, а Array.prototype.push — метод экземпляра.

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

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

Свойства функции (статические свойства)

Когда вы добавляете свойство или метод непосредственно к функции, оно становится её собственным свойством. Эти свойства часто называют статическими. Они принадлежат самой функции-конструктору как объекту и не передаются экземплярам, созданным с помощью оператора new. Они полезны для утилитарных методов, которые логически связаны с конструктором, но не требуют экземпляра.

function Car(model) {
  this.model = model;
}
// Статическое свойство функции
Car.defaultModel = 'Unknown';
// Статический метод
Car.getDefault = function() {
  return Car.defaultModel;
};

const myCar = new Car('Tesla');
console.log(myCar.model); // 'Tesla'
console.log(myCar.defaultModel); // undefined - не наследуется!
console.log(Car.getDefault()); // 'Unknown' - вызывается у конструктора

Свойства объекта prototype

Каждая функция (кроме стрелочных) при создании получает свойство prototype, которое является обычным объектом. Свойства и методы, добавленные в этот объект, становятся доступны всем экземплярам, созданным через new Constructor(). При создании экземпляра его внутренняя ссылка [[Prototype]] (доступная через __proto__ или Object.getPrototypeOf()) устанавливается на объект Constructor.prototype. Это основа прототипного наследования.

function Car(model) {
  this.model = model;
}
// Метод добавляется в prototype
Car.prototype.getModel = function() {
  return this.model;
};
// Свойство добавляется в prototype
Car.prototype.wheels = 4;

const myCar = new Car('Tesla');
console.log(myCar.getModel()); // 'Tesla' - метод найден в прототипе
console.log(myCar.wheels); // 4 - свойство найдено в прототипе
console.log(Object.getPrototypeOf(myCar) === Car.prototype); // true

Практическое применение и вывод

Статические свойства функции используются для функциональности, относящейся ко всему классу в целом (например, методы-утилиты Array.isArray, Math.max или константы). Свойства prototype используются для определения методов и общих свойств, которые должны быть у каждого экземпляра. При поиске свойства в объекте JavaScript сначала проверяет собственные свойства экземпляра, а затем поднимается по цепочке прототипов.

Итог: Используйте статические свойства для методов/данных, общих для конструктора, и свойства prototype для методов/данных, общих для всех экземпляров. Это ключевой паттерн для организации кода и реализации наследования в JavaScript до появления классов ES6.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

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

#prototype

#constructor function

#inheritance

#JavaScript

#object-oriented programming

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