В чем разница между Class.prop, Class.prototype.prop и this.prop?

Я не могу понять различия/причины/за/против между свойствами, объявленными в конструкторе класса, в прототипе класса и объявленными непосредственно в классе.

Class Human {
  constructor() {
    this.a = 0;
  }
}

Human.prototype.b = 1;

Human.c = 2;
this.a — на экземпляре. prototype — опубликовано на экземпляре каждый. Human.c — на класс (и недоступен через инстанс).
deceze 26.07.2019 10:50

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

Maheer Ali 26.07.2019 10:50

Ну, a и c в основном одно и то же — свойство экземпляра. b существует в прототипе, поэтому разница составляет прототипное наследование по сравнению с непосредственным заданием свойств.

VLAZ 26.07.2019 10:51

@VLAZ a и c — это нет одно и то же.

deceze 26.07.2019 10:52

@deceze Я имел в виду то же самое, поскольку их нет в прототипе. Нет доступа к c через экземпляр Human. Однако и a, и c напрямую связаны с объектом, и да, это два объекта другой.

VLAZ 26.07.2019 12:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть еще один связанный случай, хотя в JS он может определять только функции:

Class Human {
  d() {}  // Property d, its type is Function.
}

По сути, ваш c сильно отличается от трех других. Вы можете получить доступ только к своему c как Human.c, в то время как ко всем остальным можно получить доступ как к свойствам экземпляра класса Human, например. new Human().a.

Для определения методов предпочтительный синтаксис, вероятно, похож на d, он выглядит наиболее естественным. Фактически это то же самое, как если бы вы присвоили функцию Human.prototype, например b. Таким образом, приведенный выше пример эквивалентен Human.prototype.d = function() {}.

Например, переменные (поля), синтаксис для a, вероятно, лучше всего. Каждый экземпляр класса получает свой собственный a. Если бы он был инициализирован [] вместо 0, у каждого из них был бы отдельный массив, что, скорее всего, вы и ожидаете.

С другой стороны, свойства, назначенные прототипу класса, такие как ваш b, видны через экземпляры (поэтому new Human().b работает), но это единственный объект, к которому могут получить доступ все существующие экземпляры вашего класса, что означает, что они должны рассматриваться как неизменяемые, если вам не нравится плохой дизайн, глобальное изменяемое состояние и т. д. Так что это место, где вы можете в основном поместить:

  • функции - но для функций лучший синтаксис - это синтаксис метода (мой d),
  • неизменяемые значения - но тогда вы также можете определить их как константу вне класса или сделать их статическими (например, ваш c),
  • общее состояние, которого, возможно, лучше вообще не иметь.

Поэтому я бы вообще не использовал Class.prototype напрямую, вместо этого определял бы методы как методы и поля в конструкторе.

Другие вопросы по теме