如何重新运行/重用类构造函数

时间:2018-10-27 10:20:41

标签: javascript es6-class

我最近从es5类转到es6类,偶然发现了这个问题,我不能在没有新类的情况下调用构造函数。

在我的特定情况下,我想避免对象创建和内存分配。这就是为什么我要重用旧对象(如果您可能要问的话,这是一个瓶颈)。

所以在es5中,我这样做了:

// extend adds all given methods to the classes prototype
extend([myClass1, myClass2, ...], {
  fromArray (arr) {
      this.constructor(arr)
  }
})

这段代码将把数组传递到知道如何处理的构造函数中。这样我就可以运行高性能代码,而无需创建很多对象。

好-在es6中不再可能。我认为可以解决的唯一方法是引入一个init()方法来完成构造函数的工作。但是,正如您所看到的,许多类都需要此功能。拥有init()函数的感觉就像是一种变种又to肿的方式来添加功能。 使用现有函数作为构造函数也可以重用,因为这不是有效的语法,这也是不可能的:

class Foo {
    constructor: someReusableFunction // Syntax Error
}

我读到了撤回的call constructor,它也可以解决很多用例和我的问题(所有init东西都将放入调用构造函数中)。他们说,装饰者可以更好地解决这个问题。但是我不确定装饰器如何解决这个问题。

不允许调用构造函数的动机是,将来可能会撤消现在调用的构造函数。那么是否有可能取消限制?

我的问题:

  • 除了我提到的方法以外,是否还有其他智能解决方法?
  • 调用构造函数的函数是否会回来或者语法是否有变化,以便您可以将可重用函数指定为构造函数?

1 个答案:

答案 0 :(得分:1)

  

拥有init()函数感觉就像是一种肿而way肿的方式重新添加功能。

您可以编写一个在构造过程中调用init的类:

 class Constructable {
   constructor(...args) {
     this.init(...args);
  }

  init(a, b, c) { /*...*/ }
}

然后将其扩展:

 class Test extends Constructable {
  init(a, b, c) { /*...*/ }
 }

这样构造函数也将被继承,您可以将其用作:

 const test = new Test(1, 2, 3);
 test.init(4, 5, 6);
  

也不可能使用现有函数作为可重用的构造函数

实际上是,只需添加一个调用该函数的构造函数即可:

 constructor(...args) {
  someReusableFunction.call(this, ...args);
 }