2016-05-16 74 views
0

如何在使用Google Closure Compiler時包含Ecmascript 6類?使用Google Closure Compiler包含Ecmascript 6類?

例如,我有 '的東西/ dog.js' 類:

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

而且我希望把它列入 '的東西/ pound.js',所以我可以這樣寫:

let rex = new Dog(); 

這應該如何處理?我不能使用stuff.dog作爲類名,因此將調用傳遞給goog.provide()似乎不是一個選項。

感謝您的幫助!

編輯:採用最新(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

+0

您是否已經在使用Closure編譯器?如果你在'ECMASCRIPT_6'模式下運行它,ES6類定義應該被識別爲與傳統原型「類」定義相同的方式;他們並不是特例。如果你不是,你需要添加像goog.provide('dog')'和'goog.require('dog')'這樣的單獨文件。 –

+0

我正在使用它,但我對它很陌生。當你說'在ECMASCRIPT_6模式下運行'你的意思是將language_in設置爲'ECMASCRIPT6_STRICT'? 我有這樣的設置,我嘗試導出和導入,goog.provide()和goog.require(),一些其他的隨機組合鍵,似乎沒有任何工作... – Seanonymous

+0

是的,這就是我的意思。在這個問題中沒有足夠的信息來正確回答(Closure有很多選項/標誌,所以最好有一個你已經嘗試過的完整例子),但是:你可能要考慮使用'goog.module ',這個更新的系統表現得更像其他node.js模塊系統,雖然它仍然是路徑獨立的(你可以從任何地方goog.provide()名稱)。 [這裏是一個隨機的例子](https://github.com/vxq/js/blob/f1f0d354d77a39ebf403031fc719aeb150b7f952/vxq/worlds/turtles.js)使用'goog.module()','goog.require()'和'出口'。 –

回答

1

ES6類可以被分配到命名空間:

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

謝謝!我使用你的回答和Jeremy關於goog.module()的建議。我會添加另一個答案,所以我可以添加格式... – Seanonymous

1

使用從傑里米和乍得的答案我設法讓我的類使用一些類似的進口(感謝你們!):

「的東西/dog.js':

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

'的東西/ pound.js':

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

有一件事對我來說並不明顯,那就是名稱空間('canine')不需要與類名或文件名/路徑有任何關係。

+0

你的意思是goog。require('canine');'在第二個代碼片段中?是的,命名空間是任意的!但是如果你願意,你可以選擇直接導出類名(通過執行'goog.module('Dog')'然後'Dog = class {'或'exports = class {'或者取決於你的設置)。 –

+1

哎呀,是的。再次感謝! – Seanonymous

相關問題