我最近从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东西都将放入调用构造函数中)。他们说,装饰者可以更好地解决这个问题。但是我不确定装饰器如何解决这个问题。
不允许调用构造函数的动机是,将来可能会撤消现在调用的构造函数。那么是否有可能取消限制?
我的问题:
答案 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);
}