类表达式构造函数

时间:2017-03-26 12:00:07

标签: javascript class ecmascript-6 es6-class

使用ES6,JavaScript具有适当的类语法,允许您将它们声明为class A {}const A = class {}。后者是类表达式。

我正在开发一个可以自定义的项目。除了前缀之外,用户将创建一个具有相同名称的新文件,并且文件中的任何内容都会覆盖原始文件。但是,似乎你不能用类表达式的构造函数来做这件事。

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

您希望上述内容有效,(甚至A.prototype.constructor),但事实并非如此。

如何以这种方式正确定义构造函数?我不能在课堂宣言中提到它。

1 个答案:

答案 0 :(得分:2)

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

你可以设置A.prototype.constructor,然后给class A一个constructor一个{<1}},它遵循原型上定义的那个,如果它不再是同一个函数,转发任何传递的参数。这会产生非常不寻常的类(通常,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上定义一个静态A属性,您可以将其更改为喜好:

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!')
)