我一直在尝试使用ES6类,我想知道你是否可以动态更改类名?例如
class [Some dynamic name] {};
答案 0 :(得分:20)
对于您想要实现的任何内容,可能有更好的解决方案,但您可以为对象分配类表达式:
let classes = {};
classes[someName] = class { ... };
这在ES2015中并没有真正改变:如果你想创建一个动态命名的绑定,你必须使用一个对象或其他一些映射。
答案 1 :(得分:15)
let C = class
{ // ...
}
Object.defineProperty (C, 'name', {value: 'TheName'});
// test:
let itsName = (new C()).constructor.name;
// itsName === 'TheName' -> true
答案 2 :(得分:10)
有一种非常简单的方法:
const nameIt = (name, cls) => ({[name] : class extends cls {}})[name];
Here是演示。
它使用一个对象文字来定义一个具有所需名称的字段,该字段将包含一个新类。这会导致新类自动获取所需的名称。在我们完成之后,我们提取新类并返回它。
请注意对象文字周围的parens,以便花括号不会被误认为代码块(...) => {...}
。
当然,将现有类放入命名字段不会更改类,因此仅在创建新类时才有效。如果您只需要在一个定义要命名的类的位置使用动态名称,则可以删除额外的继承,然后执行:
const myClass = {[name]: class {
...
}}[name];
答案 3 :(得分:4)
为了进一步使用动态类名和动态继承,当使用babel时你可以做这样的事情:
function withname(name, _parent) {
return class MyDinamicallyNamedClass extends (_parent||Object) {
static get name() { return name || _parent.name }
}
}
答案 4 :(得分:2)
即使不理想,一种方法也很简单Hello
<footer class="footer">
<div class="container">
<div class="content">
<p><i class="fa fa-hashtag"></i> © 2017 - Project Name</p>
<p class="copyright">Built on the EC9 Platform with <a href="https://laravel.com/" target="_new">Laravel</a>, <a href="https://bulma.io/" target="_new">Bulma</a> and <span class="icon is-small"><i class="fa fa-heart"></i></span>.</p>
</div>
</div>
</footer>
:
eval
请注意,它必须与~function() {
const name = "Lorem"
eval(`
var ${name} = class ${name} {}
`)
console.log(Lorem) // class Lorem {}
}()
一致。在var
内使用let
,const
和普通class
工作。
eval
的另一种方式:
Function
Sitenote:您可以将范围变量传递到~function() {
const name = "Lorem"
const c = new Function(`
return class ${name} {}
`)()
console.log(c) // class Lorem {}
}()
并在其中使用:
Function
答案 5 :(得分:0)
我苦苦挣扎的例子-通过以下方式解决:
const models = {
route: mongoose.model('Route'),
company: mongoose.model('Company'),
...
}
然后:
const name = 'route'
const record = new models[name]()