Перенесите инициализацию 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.