繁体   English   中英

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

[英]How to rerun/reuse class constructors

我最近从 es5 转移到 es6 类并偶然发现了一个问题,即我不能再没有 new 就调用构造函数。

在我的特定情况下,我想避免对象创建和内存分配。 这就是为什么我想重用旧对象(以防万一,这是一个瓶颈)。

所以在 es5 中我这样做了:

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

这段代码会将数组传入知道如何处理它的构造函数中。 这使我可以在不创建大量对象的情况下运行高性能代码。

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

class Foo {
    constructor: someReusableFunction // Syntax Error
}

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

不允许调用构造函数的动机是,将来可能会使用现在撤回的调用构造函数。 那么有没有可能解除限制呢?

我的问题:

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

拥有一个 init() 函数感觉就像是一种增加功能的笨拙和臃肿的方式。

您可以编写一个在构造过程中调用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);
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM