2016-03-24 11 views
-1

私はコマンドラインからこれを解決しようとしています:コンストラクタを使って、最初のコンストラクタに渡された引数で指定されたパラメータを持つコンストラクタを作成するエレガントな方法はありますか? 動物のグループ分けのためのコンストラクタが必要だとしましょう。グループ化コンストラクターは、新しいコンストラクターがとるパラメーターを指定する引数をとります。新しいコンストラクターには、変数代入が付けられます。次に、新しいコンストラクタで、これらのパラメータをオブジェクトのプロパティとして設定することができます(以前は変数の割り当てで指定されていました)。それが思わ、私は「コンストラクタコンストラクタ」、「動的関数名の割り当て」、および「ダイナミックJavaScriptのコンストラクタ」に行ってきた検索では誰でもコンストラクタコンストラクタを作成するための雄弁な方法を知っていますか?

var herd = new grouping("species", "color", "cattle"); 
var school = new grouping("species", "color", "dolphins"); 
console.log(new herd(20, "Angus", "black")); 
herd({ 
    cattle: 20, 
    species: "Angus", 
    color: "black" 
}) 
console.log(new school(2, "Bottlenose", "grey")) 
school({ 
    dolphins: 2, 
    species: "Bottlenose", 
    color: "grey" 
}) 

:私は、その機能がこのような少し何かを探すように期待します私はこれは不可避的に乱雑です。もしそうなら、これはDRYを忘れるインスタンスになりますか?

+3

なぜパラメータとして単一のオブジェクトを使用していませんか? –

+0

これの実際の使用例は何ですか? –

+0

@Michal私は、node-json-dbを使用するSMSインタフェースのアプリケーションを作成しています。私はJSONファイルをdbとして使用しています。私が書いてきたクラスは、JSON dbを使用することによって必要とされるロジック(デフォルト、メソッド、およびコンストラクタ)を共有します。 –

答えて

0

これは、あなたが望むことをするでしょう。私たちは、これらの機能のニーズ「インスタンス」をしないので、あなたがnewでこれを呼び出す必要はないことに注意してください:

function grouping(...keys) { 
 
    return function (...values) { 
 
    return keys.reduce((obj, key, i) => (obj[key] = values[i], obj), {}); 
 
    } 
 
} 
 

 
var herd = grouping("species", "color", "cattle"); 
 
console.log(herd(20, "Angus", "black"));

しかし、あなたはこれを行う代わりに、直接、オブジェクトリテラルを使用している場合、キー名を繰り返さないようにするだけで、あなたの決定を再考してください。 herdまたはschoolを作成した呼び出しを見ることなく、渡す引数の順序を知ることはできません。 単にオブジェクトリテラルを使用すると、より保守であろうと思わ:

var obj = { 
    cattle: 20, 
    species: "Angus", 
    color: "black" 
}; 

あなたが本当に(あなたがプロトタイプを利用する場合にのみ意味があります)コンストラクタジェネレータをしたい場合は、あなたの代わりにこれを行うことができます:

function grouping(...keys) { 
 
    return function (...values) { 
 
    keys.forEach((key, i) => this[key] = values[i]); 
 
    } 
 
} 
 

 
var Herd = grouping("species", "color", "cattle"); 
 
console.log(new Herd(20, "Angus", "black"));

関連する問題