【发布时间】:2018-10-27 10:20:40
【问题描述】:
我最近从 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
}
我读到了撤回的call constructor,它可以解决很多用例和我的问题(所有初始化的东西都会进入调用构造函数)。他们说,这最好用装饰器解决。但是我不确定装饰器如何解决这个问题。
不允许调用构造函数的动机是,将来可能会使用现在撤回的调用构造函数。那么有没有机会解除限制呢?
我的问题:
- 除了我提到的之外,还有其他智能解决方法吗?
- 是否有可能返回对构造函数的函数调用或语法更改,以便您可以将可重用函数指定为构造函数?
【问题讨论】:
-
关于你的第二个问题,我对此表示怀疑。我很确定
Foo()总是会出错。
标签: javascript es6-class