Рассмотрим следующий код
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, поэтому это не проблема для моей установки.
Кажется, Бабель не очень хорошо поддерживает расширение нативных объектов. В Вавилоне 6 это вообще не работает, а в Вавилоне 7 он пытается обернуть нативы перед их расширением, но передача его через аргумент функции обходит проверку.
В этом случае достаточно простого class {}
вместо Object
.
Связанная проблема/вопрос: https://github.com/babel/babel/issues/9183