Трансформировать класс в функцию‑конструктор

Перенесите инициализацию a в функцию Test, а say — в её prototype. Тогда каждый экземпляр получит своё поле a, но будет разделять метод.

Короткий ответ

Что ответить на собеседовании

Перенесите инициализацию a в функцию Test, а say — в её prototype. Тогда каждый экземпляр получит своё поле a, но будет разделять метод.

Подробный разбор

Ответ с пояснениями

Условие

В задании дан класс Test, который необходимо преобразовать в функцию‑конструктор, сохранив его свойства и методы.

class Test {
  constructor() {
    this.a = 777;
  }

  say() {
    console.log(10);
  }
}

const res = new Test();
console.log(res);
res.say();

Перепишите этот код так, чтобы вместо объявления class использовалась функция‑конструктор, а методы были объявлены через прототип или внутри функции, как это обычно делается в старом стиле JavaScript.

Ответ

Перенесите инициализацию a в функцию Test, а say — в её prototype. Тогда каждый экземпляр получит своё поле a, но будет разделять метод.

function Test() {
  if (!new.target) throw new TypeError('Нужен new');
  this.a = 777;
}
Object.defineProperty(Test.prototype, 'say', {
  value: function () { console.log(10); },
  writable: true,
  configurable: true
});
const res = new Test();
console.log(res);
res.say();

DefineProperty сохраняет неперечисляемость метода, как у class. Это эквивалент для показанного поведения, но не полное воспроизведение всех семантических особенностей class.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее