我目前正在将一堆JavaScript模块转换为ECMAScript 6类。我们使用require.js作为AMD加载器,并手动编写define([],...)逻辑。
我们正在使用Babel将ES 6类转换回ES 5定义的模块。我的bablerc文件如下所示:
{
"presets": ["es2015"],
"plugins": ["transform-es2015-modules-amd"]
}
一个简单的类看起来像这样
import x from "dev/x"
import ko from "knockout"
import z from "dev/z"
export class y extends x {
...
}
输出看起来非常正确:
define(["exports","dev/x", "knockout", "dev/z"], function(x, knockout, z){
Object.defineProperty(exports,"__esModule",{value: true});
// Bunch of generated crap
var y = exports.y = function(_x)...(_x2.default);
}
所以当我尝试做的时候:
var foo = new y();
我得到一个"对象不支持此操作" JavaScript异常。
我试图将生成的代码(我不想做)更改为:
var y = exports = function(_x)...(_x2.default);
但那并没有做任何事情。但是,当我将该行更改为:
return function(_x)...(_x2.default);
或添加以下行:
var y = exports = function(_x)...(_x2.default);
return y;
一切都像它应该的那样。每次我们做出改变时,我都不想修改生成的文件,我只是想让babel做到这一点并且做对了!我在这里缺少什么?
更新:我使用的是Druandal库(durandaljs.com)的system.js部分,它通过传递一个名为aquire的函数来包装对require的调用,并将其加载。所以我这样打电话:
system.acquire(moduleNameAndPath).then(function acquiredModuleFunc(acquiredModule) {
if (acquiredModule !== null || acquiredModule !== undefined){
var item = new acquiredModule(); // Object doesn't support here...
}
}
我们在构造视图绑定的视图模型时使用它来引入伪多态行为。
答案 0 :(得分:1)
您正在以名称y
导出构造函数。在导入(acquire
)中,您似乎尝试在模块对象本身上使用new
。相反,尝试
system.acquire(moduleNameAndPath).then(function(acquiredModule) {
var Y = acquiredModule.y;
var item = new Y();
});