在函数中定义类是否有效

时间:2015-12-06 21:34:09

标签: javascript ecmascript-6

在es6中这个想法或类似的想法是否可行?

function() {
  class A {}
}

2 个答案:

答案 0 :(得分:2)

是的,因为一个类只是一个无法调用的函数的语法糖。相反,它必须使用new进行实例化。您可以使用https://babeljs.io/repl/来查看课程的实际效果。

示例

/* ES6 code */
class Car {
  constructor() {
    this.wheels = 4;
  }
}

/* generated ES5 code */
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Car = function Car() {
  _classCallCheck(this, Car);

  this.wheels = 4;
};

答案 1 :(得分:1)

是的,这确实与您编写的一样(没有丢失的函数名称)。

但是,我会反对它。在多次调用的函数中动态创建类会破坏共享方法(等)的目的,因为每次调用都会创建一个新的原型。当您实际上只需要在该功能中创建自定义实例时,请不要这样做。

如果您使用的是ES6模块,只需将类声明放在函数之外,但不要导出它。如果您不使用模块,只需将类和函数包装在IIFE中。

上述规则的一个例外是,您确实需要动态创建少数类。因为它们看起来非常相似,但它们可能是某些共同祖先的子类。

class Common {
    …
}
function makeSubclass(…) {
    return class Sub extends Common {
        …
    };
}
const Sub1 = makeSubclass(…);
const Sub2 = makeSubclass(…);