Estoy escribiendo una clase de grupo de objetos que conserva objetos antiguos no utilizados, y cuando se necesita uno nuevo, puede usar una de sus reservas (sin la costosa creación de objetos). Sin embargo, quiero poder guardar cualquier dato en este grupo (no limitado a algo como extends Poolable ). El problema es que la mayoría de los grupos de objetos requieren algo como esto:
class MyData { constructor(str) { this.reset(str) } reset(str) { this.str = str; } } Para que cuando se necesite una nueva instancia, el grupo pueda llamar a oldInstance.reset(prams) . Como se indicó anteriormente, no quiero esto (trabajar con muchas herramientas de terceros para las que no tengo ganas de escribir envoltorios), por lo que mis datos se ven así:
class MyData { constructor(str) { this.str = str; } } Cuando el grupo necesita restablecer una instancia, necesito poder llamar al constructor como una función y establecer this valor en la instancia que se está borrando.
Esto es muy fácil con clases antiguas que usaban sintaxis de function/prototype cuando se crearon:
const MyClass = function(str) { this.str = str; } // Reset an instance const instance = new MyClass("foo"); MyClass.apply(instance, ["bar"]) // doneSin embargo, cuando hago eso para las clases, se queja de que no puede usar una clase sin la nueva palabra clave. ¿Cómo voy a hacer esto?
Violín: https://jsfiddle.net/wuqek405/
Editar: como dije, la mayoría de los grupos de objetos necesitan una función de reinicio. Estoy tratando de usar el constructor como esta función, porque se supone que "configura" la instancia. Otra solución sería generar esta función de reinicio basada en la clase. Sin embargo, quiero que sea lo más rápido posible, por lo que las soluciones terriblemente complicadas, como encadenar la clase y eval el constructor, no serían óptimas.
Esto no es posible. Una class no se puede llamar 1 , solo se puede construir, lo que significa crear un nuevo objeto. Esto era nuevo en ES6 , que revisó el modelo de herencia de clases e introdujo super . Además, ES2022 introducirá campos de clase, que también se crean durante la construcción sin que se mencionen en el código del constructor.
Su única opción es usar solo clases basadas en function ES5, un transpilador o escribir métodos de reset explícitos.
1: técnicamente, se puede llamar ( typeof C == 'function' ), pero [[Call]] siempre lanzará una excepción