ES6动态类名

时间:2015-11-09 09:14:09

标签: javascript class ecmascript-6

我一直在尝试使用ES6类,我想知道你是否可以动态更改类名?例如

class [Some dynamic name] {}; 

6 个答案:

答案 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> &nbsp;&copy; 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内使用letconst和普通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]()