2017-03-07 47 views
3

我需要動態定義類,所以在我的ES6代碼編寫的代碼生成器:使用ES6模板文字傳播語法

function makeClass(className, baseClass = _DefaultBaseClass, ...args) { 
    return (
    eval(` 
     class ${className} extends ${baseClass} { 
     constructor(${...args}) { 
      super(${...args}) 
     } 
     } 
    `) 
) 
} 

「_DefaultBaseClass」是用來簡化上述發生器功能邏輯的空類:

class _DefaultBaseClass() { 
    constructor() {} 
} 

除了傳播運算符,一切正常工作的發生器代碼。在此示例中,展開運算符本身在我的項目之外可以在模板文字之外正常工作。

我正在使用以下webpack Babel預設/插件:'react','es2015','stage-2','transform-runtime'。

+0

爲什麼不直接降了'constructor'乾脆當它只是調用'super' - 默認構造函數做到了這一點無論如何 – Bergi

+1

[ **'...'不是一個運算符**](http://stackoverflow.com/questions/37151966/what-is-spreadelement-in-ecmascript-documentation-is-it-the-same-as-spread -oper/37152508#37152508)。它是數組文字,函數定義,函數調用和數組解構賦值語法的一部分。這不是一個獨立的事情。 '......'不是模板文字的一部分。 –

+0

@FelixKling感謝您的信息;很有幫助。 – Ethan

回答

2

正如評論中提到的...必然會出現在特定的用例中。 ${...args}甚至沒有什麼意義。結果應該是什麼?例如。如果${...args}將等於${args[0],args[1]},那麼它將評估值爲args[1],因爲這裏的,是逗號運算符。

模板文本可以包含任意的表達式,這樣你就可以做到以下幾點:

`${args.join(",")}` 
+0

感謝您的回答/見解。我傾向於使用'$ {... args}'的想法是在'makeClass'函數體中,'args'是一個數組;因此我認爲我應該能夠使用'...'語法在eval部分'傳播'數組以實現對構造函數的多個輸入。你關於逗號操作符的觀點非常有幫助。 – Ethan