На данный момент это не какой-то спрос на мои текущие проекты или что-нибудь.Просто хочу понять, как такие вещи работают.
В моих "домашних проектах" я избегаю использовать ES6, предпочитая подходы ES5.До сих пор для наследования я использую простой пример наследования прототипа, представленный большинством образовательных статей:
function SomeConstructor() {...}
function SomeExConstructor() {...}
SomeExConstructor.prototype = Object.create(SomeConstructor.prototype);
SomeExConstructor.prototype.constructor = SomeExConstructor;
Это красиво и просто, и, что важно, это работает.
Но однажды язадал себе вопрос: «Могу ли я расширить конструктор функций? Сохраняя его способность вызывать экземпляры как обычные функции».
Кажется, что описанный выше простой подход не работает таким образом.
function A() { this.asd = 2; }
A.prototype = Object.create(Function.prototype);
A.prototype.constructor = A;
var a = new A('return "Hello!";');
a();
> Uncaught TypeError: a is not a function
Сначала я подумал, что это нормально, и функция не может быть расширена.Но попробовал с современным подходом ООП (который, насколько я знаю, просто синтаксический сахар для наследования прототипа):
class B extends Function { asd = 2; };
var b = new B('return "Hello!"');
b();
> "Hello!"
Это сработало!Я пытался искать ответы в Интернете, использовал «Object.setPrototypeOf» - не повезло.
Пытался увидеть на babeljs.io, как он конвертирует class A extends Function {};
, и там было что-то адское.язык в выводе.
Один из моих коллег предложил вернуть новый экземпляр функции из моего расширенного конструктора, но это не так.
Так что есть способ правильно расширить конструктор функцийтолько с наследованием прототипа ES5?Сохранение поведения функции для экземпляров.Или это специфическое поведение классов ES6?