Ya tengo una función para modificar otros métodos de clase:
class MyClass { constructor() { this.num = 1; } inc(){ this.num++; } } runAfterMethod(classHandle, methodName, executeAfter) { const oldHandle = classHandle.prototype[methodName]; classHandle.prototype[methodName] = function () { const returnValue = oldHandle.apply(this, arguments); //@ts-ignore executeAfter.apply(this, arguments); return returnValue; }; } runAfterMethod(MyClass, "inc", function() {console.log(this.num)}) new MyClass().inc(); // Prints 2Sin embargo, esto no funciona para el constructor de la clase (porque técnicamente es la clase misma)
Con lo que realmente estaría feliz es algo que imite este comportamiento:
class MyClass { constructor() { this.num = 1; } } extendConstructor(MyClass, function(){ this.str = "hello world" }) new MyClass(); // num: 1, str: "hello world" He visto cosas como Cómo modificar el constructor de una clase ES6, sin embargo, todos requieren = en algún lugar, que no funciona dentro de una función (donde eso solo cambia el valor de la clase dentro de la función, no la clase en sí)
Mutar la clase existente es realmente raro . En mi opinión, lo que sería mucho menos olor a código sería crear un contenedor alrededor de la clase que instancia la clase, luego la llama con su devolución de llamada personalizada y luego devuelve la instancia; sería mucho más sencillo. ¿Funcionaría eso para sus propósitos?
class MyClass { constructor() { this.num = 1; } } const extendConstructor = (theClass, callback) => function(...args) { const instance = new theClass(...args); callback.call(instance); return instance; }; const Extended = extendConstructor(MyClass, function(){ this.str = "hello world" }) console.log(new Extended()); // num: 1, str: "hello world"