Class 表达式构造函数

Class Expression Constructor

在 ES6 中,JavaScript 具有正确的 class 语法,允许您将它们声明为 class A {}const A = class {}。后者是 class 表达式。

我正在从事一个一切都可定制的项目。用户将创建一个具有相同名称的新文件,但前缀除外,并且文件中的任何内容都会覆盖原始文件。但是,似乎您不能使用 class 表达式的构造函数来执行此操作。

const A = class {};
A.constructor = function(name) {
    this.name = name;
}

你会期望上面的方法有效,(甚至 A.prototype.constructor)但它没有。

如何以这种方式正确定义构造函数?我不能在 class 声明中包含它。

class 语法创建构造函数并填充分配给其 prototype 属性 的对象。没有 "class" 与构造函数分开。在您的示例中, A 是对 class {} 表达式创建的构造函数的引用。虽然您可以在分配给 A.prototype 的对象上替换 constructor 属性 的值,但这不会改变 A 所指的函数,因此也不会改变通过 new A.

会发生什么

你可以设置A.prototype.constructor,然后给class A一个constructor,它遵循原型上定义的那个如果不是不再使用相同的功能,转发传递的任何参数。这会创建非常不寻常的 类(通常,A.prototype.constructor === Atrue),但它可以满足您的需求。

const A = class {
  constructor(...args) {
     let Constructor = A.prototype.constructor
     if (Constructor !== A) {
       Constructor.apply(this, args);
     }
  }
};

(A.prototype.constructor = function(name) {
    this.name = name;
}).prototype = A

console.log(
  new A('It works!')
)

编辑: 另一个避免混淆 A.prototype.constructor 的选项是在 [=] 上定义静态 Constructor 属性 14=],你可以根据自己的喜好改变:

const A = class {

  static Constructor = Function.prototype
  
  constructor(...args) {
     A.Constructor.apply(this, args);
  }
};

A.Constructor = function(name) {
    this.name = name;
}

console.log(
  new A('It works!')
)