Как правильно расширить функцию "класс", используя наследование прототипа ES5? - PullRequest
0 голосов
/ 27 июня 2019

На данный момент это не какой-то спрос на мои текущие проекты или что-нибудь.Просто хочу понять, как такие вещи работают.

В моих "домашних проектах" я избегаю использовать 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?

...