使用Google Closure Compiler包含一个Ecmascript 6课程?

时间:2016-05-16 23:51:37

标签: javascript ecmascript-6 google-closure-compiler

如何在使用Google Closure Compiler时包含Ecmascript 6课程?

例如,我在'stuff / dog.js'中有一节课:

class dog {
    constructor() {
        …
    }
    addLeg() {
        this.legs++;
    }
}

我想把它包含在'stuff / pound.js'中,所以我可以写:

let rex = new Dog();

应如何处理?我不能将stuff.dog用作类名,因此将调用传递给goog.provide()似乎不是一个选项。

感谢您的帮助!

编辑:使用Closure Compiler的最新版本(20160517 1.0),可以使用简单的Ecmascript 6处理:

Animal.js:

export default class{
    constructor(){
        this.legs = [];
    }
    addLeg(legId){
        this.legs.push( legId );
    }
}

Dog.js:

import Animal from './Animal';

export default class extends Animal {
    constructor(){
        super();
        [1,2,3,4].forEach(leg=>this.addLeg(leg));
        console.log( 'Legs: ' + this.legs.toString() );
    }
}

虽然它确实因某些原因给我一个警告:Closure Compiler warns "Bad type annotation. Unknown type …" when Ecmascript 6 class is extended

2 个答案:

答案 0 :(得分:1)

可以将ES6类分配给名称空间:

stuff.dog = class { } 
new stuff.dog();

答案 1 :(得分:1)

使用Jeremy和Chad的答案(谢谢,伙计们!)我设法使用类似的东西导入我的课程:

'东西/ dog.js':

goog.module('canine');
canine.dog = class {
    constructor() {
        …
    }
    addLeg() {
        this.legs++;
    }
}

'东西/ pound.js':

goog.require('canine');
let rex = new canine.Dog();

对我来说显而易见的一件事是命名空间(' canine')并不需要与类名或文件名/路径有任何关系。