Tengo dos clases, una de ellas es la clase principal y la otra es la clase secundaria y lo que intento lograr es acceder a los valores de las variables de nivel de instancia de la clase secundaria mediante el uso de this palabra clave en un campo que se declara en el clase de padres . Pero cuando trato de hacerlo, devuelve undefined . ¿Puede alguien explicar qué podría estar yendo mal aquí? A continuación, he pegado un fragmento de código para su referencia. ¡Gracias!
class Parent { someField = { someValue: 'Values are ::: '+ this.value1 + ' ' + this.value2, childType2: "Some gibberish" } initialize(childType1) { this.someField = this.someField[childType1]; } } class Child extends Parent { value1 = "someValue 1" value2 = "someValue 2" } const child = new Child(); child.initialize("someValue"); console.log(child.someField);No es que this esté mal, es una cuestión de tiempo. Su código que inicializa someField se ejecuta como parte del Parent principal, antes de que su código inicialice value1 y value2 se ejecute (como parte del constructor Child ). Entonces te vuelves undefined al leerlos.
De la forma en que funcionan los campos públicos en JavaScript, la definición de la propiedad definida por la declaración del campo se convierte en parte del código del constructor, exactamente como si lo hubiera escrito al principio del constructor (justo después de cualquier llamada a super ) (pero [efectivo ] usando Object.defineProperty , no solo una asignación simple; detalles ). Es decir, su código es efectivamente el mismo que este:
class Parent { constructor() { Object.defineProperty(this, "someField", { value: { someValue: 'Values are ::: '+ this.value1 + ' ' + this.value2, childType2: "Some gibberish" }, writable: true, enumerable: true, configurable: true }); } initialize(childType1) { this.someField = this.someField[childType1]; } } class Child extends Parent { constructor() { super(); Object.defineProperty(this, "value1", { value: "someValue 1", writable: true, enumerable: true, configurable: true }); Object.defineProperty(this, "value2", { value: "someValue 2", writable: true, enumerable: true, configurable: true }); } } const child = new Child(); child.initialize("someValue"); console.log(child.someField);