Классы Flashcards
Что такое Class ?
В JavaScript класс – это разновидность функции.
Что на самом деле делает конструкция class User {…}:
Создаёт функцию с именем User, которая становится результатом объявления класса. Код функции берётся из метода constructor (она будет пустой, если такого метода нет).
Сохраняет все методы, такие как sayHi, в User.prototype.
В чем отличие класса от схожего кода только через функцию конструкутор ?
- Во-первых, функция, созданная с помощью class, помечена специальным внутренним свойством [[IsClassConstructor]]: true. Поэтому это не совсем то же самое, что создавать её вручную.
В отличие от обычных функций, конструктор класса не может быть вызван без new:
- Методы класса являются неперечислимыми. Определение класса устанавливает флаг enumerable вfalse для всех методов в “prototype”.
И это хорошо, так как если мы проходимся циклом for..in по объекту, то обычно мы не хотим при этом получать методы класса.
- Классы всегда используют use strict. Весь код внутри класса автоматически находится в строгом режиме.
Чем классы схожи с функциями ?
Как и функции, классы можно определять внутри другого выражения, передавать, возвращать, присваивать и т.д. Аналогично есть Named Function Expression, Class Expression
Записывается ли свойства классов в Prototype ?
Свойство name не устанавливается в User.prototype. Вместо этого оно создаётся оператором new перед запуском конструктора, это именно свойство объекта.
Как наследуется класс в JS ? Что может быть записано после ключевого слова ?
Синтаксис для расширения другого класса следующий: class Child extends Parent.
Синтаксис создания класса допускает указывать после extends не только класс, но и любое выражение.
Для чего существует ключевое слово super ?
Впрочем, обычно мы не хотим полностью заменить родительский метод, а скорее хотим сделать новый на его основе, изменяя или расширяя его функциональность. Мы делаем что-то в нашем методе и вызываем родительский метод до/после или в процессе.
У классов есть ключевое слово “super” для таких случаев.
super.method(…) вызывает родительский метод.
super(…) для вызова родительского конструктора (работает только внутри нашего конструктора).
Чего нет у стрелочных функций ?
Cтрелочные функции не имеют super.
При обращении к super стрелочной функции он берётся из внешней функции:
Что если у наследуемого класс нет своего конструктора ?
Согласно спецификации, если класс расширяет другой класс и не имеет конструктора, то автоматически создаётся такой «пустой» конструктор:
class Rabbit extends Animal {
// генерируется для классов-потомков, у которых нет своего конструктора
constructor(…args) {
super(…args);
}
}
Какое условие создание конструктора в наследуемых классах ? Почему так происходит ?
Конструкторы в наследуемых классах должны обязательно вызывать super(…), и (!) делать это перед использованием this.
В JavaScript существует различие между «функцией-конструктором наследующего класса» и всеми остальными. В наследующем классе соответствующая функция-конструктор помечена специальным внутренним свойством [[ConstructorKind]]:”derived”.
Разница в следующем:
Когда выполняется обычный конструктор, он создаёт пустой объект и присваивает его this .
Когда запускается конструктор унаследованного класса, он этого не делает. Вместо этого он ждёт, что это сделает конструктор родительского класса.
Поэтому, если мы создаём собственный конструктор, мы должны вызвать super, в противном случае объект для this не будет создан, и мы получим ошибку.
Для решение какой проблемы было добавлено специальное внутреннее свойство для функций: [[HomeObject]] ?
Для работы super
Для кого создается внутренние свойство [[HomeObject]] ?
Когда функция объявлена как метод внутри класса или объекта, её свойство [[HomeObject]] становится равно этому объекту.
Когда методы объектов становится не свободными ?
Но само существование [[HomeObject]] нарушает этот принцип, так как методы запоминают свои объекты. [[HomeObject]] нельзя изменить, эта связь – навсегда.
Единственное место в языке, где используется [[HomeObject]] – это super. Поэтому если метод не использует super, то мы все ещё можем считать его свободным и копировать между объектами. А вот если super в коде есть, то возможны побочные эффекты.
Есть ли [[HomeObject]] у обычных функций свойств ?
Нет
Что такое статический метод и для чего он применяется ?
Мы также можем присвоить метод самому классу. Такие методы называются статическими.
Обычно статические методы используются для реализации функций, принадлежащих классу целиком, вообще, и при этом не относящимся к каким-то отдельным объектам.