Я не могу понять различия/причины/за/против между свойствами, объявленными в конструкторе класса, в прототипе класса и объявленными непосредственно в классе.
Class Human {
constructor() {
this.a = 0;
}
}
Human.prototype.b = 1;
Human.c = 2;
Свойства, объявленные в прототипе класса, будут унаследованы каждым его экземпляром. И свойство, непосредственно добавленное в класс, не будет находиться в экземпляре, а будет только в классе. Это просто статическое свойство
Ну, a и c в основном одно и то же — свойство экземпляра. b существует в прототипе, поэтому разница составляет прототипное наследование по сравнению с непосредственным заданием свойств.
@VLAZ a и c — это нет одно и то же.
@deceze Я имел в виду то же самое, поскольку их нет в прототипе. Нет доступа к c через экземпляр Human. Однако и a, и c напрямую связаны с объектом, и да, это два объекта другой.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Есть еще один связанный случай, хотя в 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 напрямую, вместо этого определял бы методы как методы и поля в конструкторе.
this.a— на экземпляре.prototype— опубликовано на экземпляре каждый.Human.c— на класс (и недоступен через инстанс).