Вавилонское наследство теряет прототип

1

Рассмотрим следующий код

const fooBar = parent => class extends parent {
  constructor() {
    super();
    this.foo = 1;
  }
  bar() {
    return 2;
  }
}

class FooBar extends fooBar(Object) {};

console.log(new FooBar());

Он создает fooBar и выводит из него FooBar. Запуск этого кода, как и ожидалось, выдает FooBar { foo: 1 }.

Теперь позвольте принести в Вавилон. Я попробовал это с 6.xx и последним 7.2. Начиная с новой папки,

npm i @babel/core @babel/preset-env
echo { "presets": ["@babel/preset-env"] } > .babelrc
npx babel test.js > test2.js
node test2.js

Outputs { foo: 1 } - как мы видим, прототип потерян. Попытка вызвать bar вызовов на созданном экземпляре не удастся.

Это ошибка в Babel или я использую наследование неподдерживаемым способом?

Обновление: я получаю тот же результат, используя https://babeljs.io/en/repl, поэтому это не проблема для моей установки.

Теги:
babeljs

1 ответ

0

Кажется, Бабель не очень хорошо поддерживает расширение нативных объектов. В Вавилоне 6 это вообще не работает, а в Вавилоне 7 он пытается обернуть нативы перед их расширением, но передача его через аргумент функции обходит проверку.

В этом случае достаточно простого class {} вместо Object.

Связанная проблема/вопрос: https://github.com/babel/babel/issues/9183

Ещё вопросы

Сообщество Overcoder
Наверх
Меню