在babel变换之后,对象不支持此动作new x()

时间:2016-03-23 19:37:17

标签: javascript ecmascript-6 babeljs amd js-amd

我目前正在将一堆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...
    }
}

我们在构造视图绑定的视图模型时使用它来引入伪多态行为。

1 个答案:

答案 0 :(得分:1)

您正在以名称y导出构造函数。在导入(acquire)中,您似乎尝试在模块对象本身上使用new。相反,尝试

system.acquire(moduleNameAndPath).then(function(acquiredModule) {
    var Y = acquiredModule.y;
    var item = new Y();
});