← Назад к вопросам

Является ли наследованием создание класса через ключевое слово new?

2.0 Middle🔥 182 комментариев
#JavaScript Core

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ключевое слово new и наследование

Нет, создание класса через ключевое слово new не является наследованием. Это два разных, но взаимосвязанных механизма в объектно-ориентированном программировании (ООП). Давайте разберем это подробно.

1. Оператор new — создание экземпляра (инстанциация)

Ключевое слово new используется для создания экземпляра (объекта) на основе класса или функции-конструктора. Этот процесс называется инстанциацией.

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

// Оператор new создает экземпляр класса User
const user1 = new User('Анна');
const user2 = new User('Петр');

Здесь:

  • User — это класс (шаблон).
  • user1 и user2 — экземпляры класса User, созданные через new.
  • Каждый экземпляр имеет свои собственные данные (разные имена), но общую структуру и методы.

2. Наследование — создание иерархии классов

Наследование — это механизм, при котором один класс (дочерний, производный) заимствует свойства и методы другого класса (родительского, базового). В JavaScript для этого используются ключевые слова extends и super.

class User {
  constructor(name) {
    this.name = name;
  }
  
  greet() {
    return `Привет, меня зовут ${this.name}`;
  }
}

// Наследование: Admin наследует от User
class Admin extends User {
  constructor(name, role) {
    super(name); // Вызов конструктора родительского класса
    this.role = role;
  }
  
  // Дополнительный метод
  manage() {
    return `${this.name} управляет системой как ${this.role}`;
  }
}

// Создание экземпляра унаследованного класса
const admin = new Admin('Мария', 'администратор');
console.log(admin.greet()); // Метод унаследован от User
console.log(admin.manage()); // Собственный метод Admin

3. Ключевые различия

АспектКлючевое слово newНаследование (через extends)
ЦельСоздание объекта из классаСоздание иерархии классов
Ключевые словаnewextends, super
РезультатЭкземпляр классаНовый класс, расширяющий другой
Когда выполняетсяВ runtime при создании объектаПри определении класса

4. Как они взаимодействуют

Хотя new и наследование — разные механизмы, они тесно связаны:

  1. Сначала определяется иерархия классов через наследование.
  2. Затем с помощью new создаются экземпляры любых классов в этой иерархии.
// Наследование
class Animal {
  constructor(name) {
    this.name = name;
  }
}

class Dog extends Animal {
  bark() {
    return `${this.name} лает: Гав!`;
  }
}

// Инстанциация через new
const myDog = new Dog('Бобик');
console.log(myDog.bark()); // "Бобик лает: Гав!"

5. Что происходит при вызове new

Когда вызывается new Constructor(), JavaScript выполняет:

  1. Создание нового пустого объекта
  2. Связывание прототипа этого объекта с Constructor.prototype
  3. Вызов конструктора с привязкой this к новому объекту
  4. Возврат созданного объекта (если конструктор не возвращает свой объект)
// Внутренняя логика (упрощенно)
function newSimulation(constructor, ...args) {
  const obj = {}; // 1. Создание пустого объекта
  Object.setPrototypeOf(obj, constructor.prototype); // 2. Связывание прототипа
  const result = constructor.apply(obj, args); // 3. Вызов конструктора
  return result instanceof Object ? result : obj; // 4. Возврат объекта
}

6. Ошибки в понимании

Частая путаница возникает потому, что:

  • new используется для создания объектов как из базовых, так и из унаследованных классов
  • В цепочке наследования участвует механизм прототипов, который также связан с работой new
  • В устаревшем коде (ES5) наследование реализовывалось через new и манипуляции с прототипами

Важно: new — это оператор создания экземпляра, а наследование — это отношение между классами. Можно создавать экземпляры (new) без наследования, и можно определять наследование без немедленного создания экземпляров.

Заключение

Создание класса через new — это инстанциация, а не наследование. Наследование устанавливает отношение "является" между классами (Admin является User), а new создает конкретные объекты на основе этих классов. Понимание этого различия критически важно для правильного проектирования объектно-ориентированных систем в JavaScript.