Здесь есть три проблемы:
(1) super доступен только внутри методов объекта, поэтому нет доступа к super в функции стрелки. Это нужно каким-то образом заменить обычным вызовом функции.
(2) Классы могут только создаваться, но не вызываться (в отличие от функций, действующих как конструкторы). Поэтому вы не можете просто .call
конструктор классов на экземпляр "подкласса". Вы должны создать экземпляр суперкласса и скопировать его в подкласс, в конечном итоге потеряв геттеры / сеттеры.
(3) Функции со стрелками имеют лексический this
, поэтому вы не можете получить доступ к экземпляру с помощью this
внутри функции стрелки.
Учитывая эти три проблемы, жизнеспособной альтернативой будет:
function extend(superclass, constructor) {
function Extended(...args) {
const _super = (...args) => Object.assign(this, new superclass(...args));
constructor.call(this, _super, ...args);
}
Object.setPrototypeOf(Extended, superclass);
Object.setPrototypeOf(Extended.prototype, superclass.prototype);
return Extended;
}
const Rectangle = extend(Polygon, function(_super, length, width) {
_super(/*...*/);
/*...*/
});
Но, честно говоря ... что не так с нативным class ... extends
?