巴别塔传承失去原型

时间:2018-12-13 22:41:48

标签: javascript babeljs

考虑以下代码

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 }

现在让我们引入Babel。我在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

输出{ foo: 1 }-如我们所见,原型丢失了。尝试在创建的实例上调用bar将会失败。

这是Babel中的bug,还是我以不受支持的方式使用继承?

更新:我使用https://babeljs.io/en/repl得到了相同的结果,因此安装似乎没有问题。

1 个答案:

答案 0 :(得分:0)

Babel似乎不太支持扩展原生对象。在Babel 6中,这根本不起作用,在Babel 7中,它尝试在扩展本机之前将其包装,但是通过函数参数传递它会绕过检查。

在这种情况下,简单的class {}而不是Object就足够了。

相关问题/问题:https://github.com/babel/babel/issues/9183