ES6中是否允许使用类生成功能?

时间:2016-12-01 13:48:04

标签: javascript

我需要通过一些参数创建类。我想用一个函数来做。我尝试使用node.js v7.0它看起来运行良好,但我想知道es6规范是否允许它。

例如:

const MyClassGenerator = (something) => {
  return class GeneratedClass {
    get type() {
      return something;
    }
  }
}

class MyInheritedClass extends MyClassGenerator('foo') {
  ...
}

new MyInheritedClass().type // => 'foo'

2 个答案:

答案 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.