[英]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.