Estoy invocando una función en el constructor donde quiero usar la variable del niño en la llamada de función que se realiza a través del constructor principal. Para fines de demostración, he creado un pequeño script para mostrar lo que quiero hacer:
class A{ intVal = 1; constructor() { this.identifyClass(); } identifyClass() { console.log("I am class A", this.intVal); // This should be the value that B has overwitten } } class B extends A { intVal = 2; } const x = new B(); Entonces, me gustaría que la función en el constructor principal use el valor que B sobrescribió, es decir. intVal = 2 pero actualmente usa el valor original. ¿Puedo usar alguna solución para esto para no tener que crear un constructor en B y luego invocar la función allí?
Nota : es una aplicación muy compleja en la que no quiero romper los cambios en A, que se usa en muchos lugares y la Clase B está expuesta al público, por lo que no quiero que las personas que usan la Clase B cambien nada si posible donde actualmente solo sobrescriben la variable de instancia
Vale, creo que lo tengo. Creamos un símbolo , si el último argumento pasado al constructor no es el símbolo, entonces creamos un nuevo objeto, usando this.constructor , pasando los argumentos originales, más el símbolo, y luego llamamos identify . Esto separa efectivamente la llamada para identify del constructor, permitiéndonos obtener this.intVal de la subclase, sin dejar de ser transparente para el usuario de la subclase.
const _sym = Symbol(); class A { intVal = 1; constructor() { const args = Array.from(arguments); const _ = args[args.length - 1]; if (_ !== _sym) { args.push(_sym); const el = new this.constructor(...args); el.identify(); return el; } } identify() { console.log(this.intVal); } } class B extends A { intVal = 2; } const x = new A(); const y = new B();