Вопрос №55708 от пользователя Юник Степанян в уроке «Статические свойства и методы», курс «JS: Введение в ООП»

Юник Степанян

Здравствуйте! Перечитываю эту статью уже ощутимо больше года, но все ещё встречаюсь с проблемой: не могу понять границу между свойствами класса с обращением к ним внутри\извне и свойствами функции конструктора с обращением к ним внутри\извне.

Если свойство класса является только функцией в прототипах, то выходит что все свойства класса = прототипы функции-конструктора.

Получается, мы имеем отдельно свойства функции-конструктора внутри класса (с обращением через Money.constructor.) и имеем прототипы функции конструктора внутри класса (с обращением через Money.)

На основании предыдущих уроков могу сделать вывод, что в первом случае такое свойство будет копироваться всеми объектами, созданными через new Money, также как и value, а во втором - будет храниться на уровень выше, в прототипе этого экземпляра.

Но в теории показывается, что через Money.constructor.* мы можем изменить какое-то свойство сразу для ВСЕХ объектов, созданных через new Money. Получается, что эти свойства тоже хранятся на уровень выше и не копируются в каждый объект, как и прототипы. Тогда, в чём разница между свойством функции-конструктора и его прототипом?

1 1

Maksim Litvinov

Добрый день, Юрий! Статические свойства и методы принадлежат всему классу в целом и не принадлежат конкретному экземпляру класса. Отличие статических методов (добавленных в свойства функции-конструктора) от обычных методов (добавленных в прототип) в том, что обычные методы доступны во всех объектах класса, а статические нет. Доступ к статическим свойствам и методам можно получить по имени класса. Взгляните на пример:

// Создадим класс
class Cat {
  constructor(name) {
    this.name = name;
  }
}

// Обычный метод для получения имени, добавленный в свойство  prototype функции-конструктора
Cat.prototype.getName = function getName() {
  return this.name;
}

// Добавим статическое свойство всем котам. Класс-млекопитающие
Cat.class = "Mammals"

// И статический метод для получения класса животного
Cat.getClass = function getClass() {
  return this.class;
}

// Создадим нового кота
cat1 = new Cat('vaska');

// Обычный метод доступен в каждом экземпляре класса
console.log(cat1.getName());  // 'vaska'

// А статический - нет
console.log(cat1.getClass()); // TypeError: cat1.getClass is not a function

// Статический метод принадлежит всем котам в целом, а не конкретному. Доступ к нему можно получить через функцию-конструктор
console.log(Cat.getClass()); // "Mammals"
8

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
18 мая 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
18 мая 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
18 мая 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
18 мая 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
18 мая 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
18 мая 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
18 мая 5 месяцев