2016-12-01 81 views
0

我需要通過一些參數創建類。我想用一個函數來做。我嘗試使用node.js v7.0它看起來運行良好,但我想知道是否允許es6規範。ES6允許類生成功能嗎?

例如:

const MyClassGenerator = (something) => { 
    return class GeneratedClass { 
    get type() { 
     return something; 
    } 
    } 
} 

class MyInheritedClass extends MyClassGenerator('foo') { 
    ... 
} 

new MyInheritedClass().type // => 'foo' 
+1

是不是新的'class XXX'語法只是語法糖?如果是這樣,它應該工作。 –

回答

3

是,class語法既可用於聲明和表達式中使用,在任何範圍內 - 它並不需要是(基於模塊)頂部-水平。

返回類的函數非常有可能,並且按照您的預期工作。然而,這往往是一個壞IDA:

  • 生成的類通常是相當彼此相似,但它們缺乏通用超
  • 如果在extends子句使用時,它常常引入的不必要的電平遺產。

爲了應對1點,就可以讓所有生成的類extend共享一個:

class Base { 
    get type() { 
    return this.constructor.type; 
    } 
} 
const MyClassGenerator = (something) => { 
    class GeneratedClass extends Base {} 
    GeneratedClass.type = something; 
    return GeneratedClass 
} 

(在這種情況下沒有太大的用處,但往往有一個很好的方法)

要計數器2點,你通常不希望使用extends混合生成的東西到你的班級。而是使用裝飾者!

function myClassDecorator = (something, constructor) => { 
    Object.defineProperty(constructor.prototype, "type", { 
    get() { 
     return something; 
    }, 
    configurable: true 
    }); 
    return constructor; 
} 

let MyInheritedClass = myClassDecorator('foo', class { 
    ... 
});