私はES6クラスで実験してきましたが、クラス名を動的に変更できるかどうか疑問に思っていますか?例えば
class [Some dynamic name] {};
あなたが達成しようとしているものにはおそらくもっと良い解決策がありますが、クラス式をオブジェクトに割り当てることができます:
let classes = {};
classes[someName] = class { ... };
ES2015ではこれは実際には変わりませんでした。動的な名前のバインディングを作成する場合は、代わりにオブジェクトまたは他のマッピングを使用する必要があります。
let C = class
{ // ...
}
Object.defineProperty (C, 'name', {value: 'TheName'});
// test:
let itsName = (new C()).constructor.name;
// itsName === 'TheName' -> true
簡単な方法があります:
const nameIt = (name, cls) => ({[name] : class extends cls {}})[name];
ここ はデモです。
オブジェクトリテラルを使用して、新しいクラスを保持する必要な名前のフィールドを定義します。これにより、新しいクラスは自動的に目的の名前を取得します。それが終わったら、その新しいクラスを抽出して返します。
オブジェクトリテラルを囲む括弧に注意してください。これにより、中括弧がコードブロック(...) => {...}
と間違えられないようにします。
もちろん、既存のクラスを名前付きフィールドに配置してもクラスは変更されないため、これは新しいクラスを作成する場合にのみ機能します。命名するクラスを定義する1つの場所でのみ動的な名前が必要な場合は、余分な継承を削除してそのまま実行できます。
const myClass = {[name]: class {
...
}}[name];
1つの方法は、たとえ理想的ではないにしても、eval
を使用すると簡単です。
~function() {
const name = "Lorem"
eval(`
var ${name} = class ${name} {}
`)
console.log(Lorem) // class Lorem {}
}()
注、var
である必要があります。 let
内でconst
、class
、およびプレーンeval
を使用しても機能しません。
Function
の別の方法:
~function() {
const name = "Lorem"
const c = new Function(`
return class ${name} {}
`)()
console.log(c) // class Lorem {}
}()
サイトノート:スコープ変数をFunction
に渡し、内部で使用できます。
~function() {
const name = "Lorem"
const val = "foo"
const Class = new Function('val', `
return class ${name} {
constructor() {
console.log( val )
}
}
`)( val )
console.log(Class) // class Lorem {}
new Class // "foo"
}()
動的なクラス名と動的な継承をさらに試してみるために、babelを使用するときは、次のようなことができます。
function withname(name, _parent) {
return class MyDinamicallyNamedClass extends (_parent||Object) {
static get name() { return name || _parent.name }
}
}
私が苦労した例-以下の方法で解決しました:
const models = {
route: mongoose.model('Route'),
company: mongoose.model('Company'),
...
}
その後:
const name = 'route'
const record = new models[name]()