我一直在试验 ES6 类,想知道您是否可以动态更改类名?例如
class [Some dynamic name] {};
我一直在试验 ES6 类,想知道您是否可以动态更改类名?例如
class [Some dynamic name] {};
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];
这是演示。
它使用对象字面量来定义一个具有所需名称的字段,该字段将包含一个新类。这会导致新类自动获得所需的名称。完成后,我们提取该新类并将其返回。
注意对象字面量周围的括号,以免花括号被误认为是代码块(...) => {...}
。
当然,将现有类放入命名字段不会更改该类,因此这仅在您创建新类时才有效。如果您只需要在定义要命名的类的地方使用动态名称,则可以删除额外的继承,然后继续:
const myClass = {[name]: class {
...
}}[name];
对于您想要实现的任何目标,可能都有更好的解决方案,但您可以为对象分配一个类表达式:
let classes = {};
classes[someName] = class { ... };
这在 ES2015 中并没有真正改变:如果你想创建一个动态命名的绑定,你必须使用一个对象或其他一些映射来代替。
为了更深入地使用动态类名和动态继承,在使用 babel 时,您可以执行以下操作:
function withname(name, _parent) {
return class MyDinamicallyNamedClass extends (_parent||Object) {
static get name() { return name || _parent.name }
}
}
一种方法,即使不理想,也很简单eval
:
~function() {
const name = "Lorem"
eval(`
var ${name} = class ${name} {}
`)
console.log(Lorem) // class Lorem {}
}()
请注意,它必须与var
. 在里面使用let
, const
, 和 plainclass
是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"
}()