我一直在尝试使用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
Object.defineProperty(C,'name',...)
可以工作,而 C.name = ...
会抛出“脚本错误:“name”是只读的”。 - Wiktor TomczakObject.defineProperty()
是否允许修改只读属性,还是这只是一个不应该存在的实现问题? - David Given有一种相当简单的方法:
const nameIt = (name, cls) => ({[name] : class extends cls {}})[name];
这里是演示。
它使用对象字面量来定义一个字段,该字段具有所需的名称并保存一个新类。这将使得新类自动获得所需的名称。完成后,我们提取该新类并返回它。
请注意对象字面量周围的圆括号,以便花括号不会被误认为是代码块(...) => {...}
。
当然,将现有类放入命名字段中不会更改类,因此仅在创建新类时才起作用。如果您只需要在定义要命名的类的位置上动态地使用名称,可以省略额外的继承,只需执行以下操作:
const myClass = {[name]: class {
...
}}[name];
static create = (args) => new this(args);
在这种情况下,名称将是“_class”。 - pPanda_beta也许有更好的解决方案能够实现你的目标,但你可以为对象分配一个类表达式:
let classes = {};
classes[someName] = class { ... };
在ES2015中,这并没有真正改变:如果你想创建一个动态命名的绑定,你必须使用一个对象或其他映射而不是直接使用变量名。
.name
现在是 someName
。 - Bergi{[someName]: class {…}}
时。 - Bergiclass Foo {}
。 - Bergi一种方式,即使不是理想的方式,也可以使用eval
来简化:
~function() {
const name = "Lorem"
eval(`
var ${name} = class ${name} {}
`)
console.log(Lorem) // class Lorem {}
}()
var
。在eval
中使用let
、const
和普通的class
是行不通的。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"
}()
Function
或eval
中时才会成为问题。如果你所拼接的代码是你自己编写的(例如,该代码字符串是在与Function
或eval
相同的作用域中生成的,并且没有来自外部的输入),那么这不是一个问题。 - trusktr function withname(name, _parent) {
return class MyDinamicallyNamedClass extends (_parent||Object) {
static get name() { return name || _parent.name }
}
}
class MyDinamicallyNamedClass ...
。 - trusktrMyDinamicallyNamedClass instanceof _parent
返回 true。顺便说一下,那不是 Dynamically 的拼写方式,哈哈。 - JΛYDΞV
Function
构造函数创建一个标准函数(使用JavaScript中的动态函数名),并像在ES5中一样使用原型。或者使用类似Gulp/Grunt的任务运行器在预构建时生成类。 - CodingIntrigueclass Foo extends multiple(One, Two, Three){...}
这样的工具,该工具使用Proxy将多个类组合在一起。我想要动态定义类名的真正原因是因为我可以根据给定名称生成基于用户类规范的类,并提供API,如Class('Foo').extends(One, Two, { ... })
,它会自动生成一个双重作用的类和类工厂mixin。我们还可以转换普通的class Foo extends (One, Two, Three) {}
。 - trusktr