2016-12-01 15 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共有される1つを聞かせすることができます

(この場合は、あまりにも便利な、しかし多くの場合、良い方法ではない)

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 { 
    ... 
}); 
関連する問題