我需要通过一些参数创建类。我想用一个函数来做。我尝试使用node.js v7.0它看起来运行良好,但我想知道es6规范是否允许它。
例如:
const MyClassGenerator = (something) => {
return class GeneratedClass {
get type() {
return something;
}
}
}
class MyInheritedClass extends MyClassGenerator('foo') {
...
}
new MyInheritedClass().type // => 'foo'
答案 0 :(得分:3)
是的,class
语法既可以用于声明,也可以用作表达式,在任何范围内 - 它都不需要(模块)顶级。
返回类的函数非常有可能,并且如您所见,可以按预期工作。然而,它往往是一个糟糕的ida:
extends
子句中使用,它通常会引入不必要的继承级别。要反击第1点,您可以让所有生成的类extend
成为共享类:
class Base {
get type() {
return this.constructor.type;
}
}
const MyClassGenerator = (something) => {
class GeneratedClass extends Base {}
GeneratedClass.type = something;
return GeneratedClass
}
(在这种情况下不太有用,但通常是一种好方法)
要反击第2点,您通常不希望使用extends
将生成的内容混合到您的班级中。而是使用装饰者!
function myClassDecorator = (something, constructor) => {
Object.defineProperty(constructor.prototype, "type", {
get() {
return something;
},
configurable: true
});
return constructor;
}
let MyInheritedClass = myClassDecorator('foo', class {
...
});
答案 1 :(得分:0)
来自MDN:
ECMAScript 6中引入的JavaScript类 是JavaScript现有的基于原型的继承的语法糖。
和
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Class definitions' in that specification.