【发布时间】:2016-06-16 22:35:41
【问题描述】:
我目前的任务是将 JavaScript 组件 ES5 转换为 ES6(使用 Babel.js 编译)。在使用类和 Babel.js 之前,我们进行了原型设计以从其他组件中获取函数。
com.company.js.ComponentA.prototype = new com.company.js.utils.UltraFunctions()
现在使用 Babel.js 并将 ComponentA 变成一个类时
class ComponentA {
contructor(){
this.property = "Proppy";
}
doStuff() {
console.log("doStuff");
}
}
当我在实例化这个组件后分析它时会发生什么,我现在看到了两个级别的原型。第一个原型拥有“属性”-第二个原型嵌套在第一个原型中,在这种情况下拥有所有功能“doStuff”。这带来了遗留组件的问题,这些组件不应该转换为类(还)。因为这些组件是通过二级原型放入的,所以它们覆盖了保存由 Babel.js 编译的“合成”类的功能的原型。
我不是在寻求解决方案。我只是想确定我对 Babel.js 将类转换为 ES5 JavaScript 的假设是否正确。尤其是上面提到的创建两级原型的事实。
更新
对不起,我误解了第一个原型!正如@T.J.Crowder 在 cmets 中所说,第一个是实例 - 因此“属性”被砸到实例中,而函数通过原型插入到“第一”级原型。所以,将我所说的一切替换为二级到一级,一级到实例。
【问题讨论】:
-
“当我在实例化这个组件后分析它时会发生什么,我现在看到了两层原型。” 不,只有一层。您看到的第一个级别是 instance,而不是它的原型,与旧的
function样式“类”完全一样。 -
我认为您需要显示更多上下文。使用
new为构造函数的prototype属性创建对象,如您的“之前”示例所示,几乎总是一种反模式,因此,如果您可以展示更多您的内容重新做,也许可以解释为什么在那里使用new,并单独说明为什么你认为 Babel 的东西创建了多个级别的原型,这会很有用。 -
对不起,我误解了第一个原型!正如@T.J.Crowder 所说,第一个是实例 - 因此“属性”被砸到实例中,同时通过原型设计将函数插入到“第一”级原型!
-
我不明白你所说的“粉碎”是什么意思。
constructor中的代码与旧式构造函数中的代码完全相同:将属性放在实例上。新语法对结果的内存布局引入了 no 更改。 -
很抱歉使用“smashed”。我并不总是乐于使用务实的术语,所以我尝试用有趣的同义词来增加趣味。请给我一些时间来可视化我们使用的组件层次结构的差异以及 Babel.js 的结果如何与之相适应。但请记住,我不需要解决问题的方法。我只是想讨论一下 Babel.js 如何将一个类转换为 ES5 Javascript
标签: javascript class compilation babeljs