JS: Прототипы

Теория: Наследование

В прошлом уроке мы обсудили иерархии типов как идею. Теперь переходим к механике наследования в коде.

Наследование - это способ выразить отношение "частное - общее" и переиспользовать поведение базового типа.

Inheritance

Базовый тип

Начнем с простого узла Node, который хранит имя и умеет его отдавать:

class Node {
  constructor(name) {
    this.name = name;
  }

  getName() {
    return this.name;
  }
}

Это общий контракт, который пригодится нескольким видам тегов.

Подтип

Теперь создаем специализированный тип, например PairedTag, который наследуется от Node и добавляет body:

class PairedTag extends Node {
  constructor(name, body = '') {
    super(name);
    this.body = body;
  }

  toString() {
    return `<${this.getName()}>${this.body}</${this.getName()}>`;
  }
}

Подтип использует базовое поведение (getName) и добавляет свое (toString).

Что это дает

  • меньше дублирования
  • общий контракт в одном месте
  • специализация там, где реально разные правила поведения

Пример использования:

const tag = new PairedTag('h1', 'text');

console.log(tag.getName());
// h1
console.log(tag.toString());
// <h1>text</h1>

Важный практический акцент

Наследование не привязано к слову class. В JavaScript классы - это удобная форма записи поверх более базовых механизмов, которые мы разберем дальше.

Поэтому важно понимать не только синтаксис, но и модель:

  • откуда берется поведение
  • как вызывается "родительская" логика
  • как устроено переопределение методов

Итоги

Наследование полезно, когда подтип действительно расширяет базовый контракт.

Если связь искусственная и нужна только ради повторного использования кода, чаще лучше выбрать композицию. Этот критерий сильно снижает количество ошибок в архитектуре.

Дальше

Завершено

0 / 10