Создание подкласса декорированного класса JavaScript

Я украшаю класс, чтобы предоставить аргументы его конструктору, проблема возникает, когда я пытаюсь создать подкласс этого класса:

@decorate('foo', 'bar')
class Foo {
    constructor(foo, bar) {}
}

class Bar extends Foo {}


function decorate(foo, bar) {
    return function(ctor) {
        return ctor.bind(null, foo, bar);
    };
}

Вышеупомянутое не будет работать из-за контекста null, переданного конструктору (по крайней мере, я думаю, что это корень проблемы). При использовании с Babel возникает следующая ошибка: «Прототип объекта может быть только объектом или нулем: не определено».

Есть ли способ украсить родительский класс и расширить дочерний?


person BTC    schedule 03.02.2016    source источник
comment
Я думаю, что это больше о том, чтобы не поставлять new туда. Если ваш function(ctor) выглядит как return function() { return new ctor(foo, bar); }, он работает.   -  person raina77ow    schedule 03.02.2016


Ответы (1)


Попытка расширить функцию, созданную с помощью .bind, не сработает. Связанные функции имеют массу специальной логики. Связанные функции не имеют свойства .prototype, что означает, что расширение связанной функции означало бы отсутствие цепочки прототипов. Правильным способом реализации этого декоратора было бы сделать

function decorate(foo, bar) {
  return ctor => class extends ctor {
    constructor(...args){
      super(foo, bar, ...args);
    }
  };
}
person loganfsmyth    schedule 03.02.2016
comment
Я бы сказал, что это не столько особая логика, ошибка намекает на отсутствие у них свойства .prototype. - person Bergi; 03.02.2016