Для понимания того, как соотносятся друг с другом внутренности классов, которые связаны наследованием, нужно разобраться с таким понятием как позднее связывание (late binding).
Вспомним базовый класс HTMLElement из прошлого урока. Внутри него активно используется this
для обращения к свойствам:
// Базовый класс для всех тегов. Умеет работать с атрибутами.
class HTMLElement {
constructor(attributes = {}) {
this.attributes = attributes;
}
getAttribute(key) {
return this.attributes[key];
}
}
Предположим, что мы создаем объект класса HTMLAnchorElement (который наследует HTMLElement). Тогда объектом какого класса будет this
внутри методов родительского класса? Правильный ответ: HTMLAnchorElement, то есть того класса, объект которого мы прямо сейчас создаем. Посмотрите на пример:
class A {
constructor() {
this.name = 'From A';
}
getName() {
console.log(this.constructor);
return this.name;
}
}
class B extends A {}
const b = new B();
console.log(b.getName());
// [class B extends A]
// => From A
Эта особенность this
называется поздним связыванием. Оно означает, что на момент определения класса, тип this
неизвестен. В качестве текущего объекта может выступать объект любого класса, наследуемого от текущего. Все выглядит так, как будто весь код внутри базового класса скопировали и перенесли в каждый класс-наследник. Для позднего связывания не важно, насколько глубокая иерархия наследования. this
всегда будет объектом того класса, который конструируется в коде.
Позднее связывание — важный элемент в работе наследования. Без него взаимодействие классов стало бы значительно сложнее и ограниченнее. Каждый объект должен был бы наверняка знать, к какому классу конкретно относятся свойства и методы в цепочке наследования. Понадобился бы специальный синтаксис для доступа к ним.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.