Классы Flashcards

1
Q

Что такое Class ?

A

В JavaScript класс – это разновидность функции.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Что на самом деле делает конструкция class User {…}:

A

Создаёт функцию с именем User, которая становится результатом объявления класса. Код функции берётся из метода constructor (она будет пустой, если такого метода нет).
Сохраняет все методы, такие как sayHi, в User.prototype.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

В чем отличие класса от схожего кода только через функцию конструкутор ?

A
  1. Во-первых, функция, созданная с помощью class, помечена специальным внутренним свойством [[IsClassConstructor]]: true. Поэтому это не совсем то же самое, что создавать её вручную.

В отличие от обычных функций, конструктор класса не может быть вызван без new:

  1. Методы класса являются неперечислимыми. Определение класса устанавливает флаг enumerable вfalse для всех методов в “prototype”.

И это хорошо, так как если мы проходимся циклом for..in по объекту, то обычно мы не хотим при этом получать методы класса.

  1. Классы всегда используют use strict. Весь код внутри класса автоматически находится в строгом режиме.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Чем классы схожи с функциями ?

A

Как и функции, классы можно определять внутри другого выражения, передавать, возвращать, присваивать и т.д. Аналогично есть Named Function Expression, Class Expression

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Записывается ли свойства классов в Prototype ?

A

Свойство name не устанавливается в User.prototype. Вместо этого оно создаётся оператором new перед запуском конструктора, это именно свойство объекта.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Как наследуется класс в JS ? Что может быть записано после ключевого слова ?

A

Синтаксис для расширения другого класса следующий: class Child extends Parent.

Синтаксис создания класса допускает указывать после extends не только класс, но и любое выражение.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Для чего существует ключевое слово super ?

A

Впрочем, обычно мы не хотим полностью заменить родительский метод, а скорее хотим сделать новый на его основе, изменяя или расширяя его функциональность. Мы делаем что-то в нашем методе и вызываем родительский метод до/после или в процессе.

У классов есть ключевое слово “super” для таких случаев.

super.method(…) вызывает родительский метод.
super(…) для вызова родительского конструктора (работает только внутри нашего конструктора).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Чего нет у стрелочных функций ?

A

Cтрелочные функции не имеют super.

При обращении к super стрелочной функции он берётся из внешней функции:

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Что если у наследуемого класс нет своего конструктора ?

A

Согласно спецификации, если класс расширяет другой класс и не имеет конструктора, то автоматически создаётся такой «пустой» конструктор:

class Rabbit extends Animal {
// генерируется для классов-потомков, у которых нет своего конструктора
constructor(…args) {
super(…args);
}
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Какое условие создание конструктора в наследуемых классах ? Почему так происходит ?

A

Конструкторы в наследуемых классах должны обязательно вызывать super(…), и (!) делать это перед использованием this.

В JavaScript существует различие между «функцией-конструктором наследующего класса» и всеми остальными. В наследующем классе соответствующая функция-конструктор помечена специальным внутренним свойством [[ConstructorKind]]:”derived”.

Разница в следующем:

Когда выполняется обычный конструктор, он создаёт пустой объект и присваивает его this .
Когда запускается конструктор унаследованного класса, он этого не делает. Вместо этого он ждёт, что это сделает конструктор родительского класса.
Поэтому, если мы создаём собственный конструктор, мы должны вызвать super, в противном случае объект для this не будет создан, и мы получим ошибку.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Для решение какой проблемы было добавлено специальное внутреннее свойство для функций: [[HomeObject]] ?

A

Для работы super

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Для кого создается внутренние свойство [[HomeObject]] ?

A

Когда функция объявлена как метод внутри класса или объекта, её свойство [[HomeObject]] становится равно этому объекту.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Когда методы объектов становится не свободными ?

A

Но само существование [[HomeObject]] нарушает этот принцип, так как методы запоминают свои объекты. [[HomeObject]] нельзя изменить, эта связь – навсегда.

Единственное место в языке, где используется [[HomeObject]] – это super. Поэтому если метод не использует super, то мы все ещё можем считать его свободным и копировать между объектами. А вот если super в коде есть, то возможны побочные эффекты.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Есть ли [[HomeObject]] у обычных функций свойств ?

A

Нет

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Что такое статический метод и для чего он применяется ?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Чему равен this у статического метода ?

A

Значением this при вызове User.staticMethod() является сам конструктор класса User (правило «объект до точки»).

15
Q

Можно ли вызвать статический метод для отдельных объектов ?

A

Статические методы могут вызываться для классов, но не для отдельных объектов.

Например. такой код не будет работать:

// …
article.createTodays(); /// Error: article.createTodays is not a function

16
Q

Какой оператор позволяет проверить, принадлежит ли объект указанному классу, с учётом наследования ?

A

Оператор instanceof позволяет проверить, принадлежит ли объект указанному классу, с учётом наследования.