es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cuál es el orden de ejecución del constructor super() y los métodos de subclase en la programación orientada a objetos en JavaScript?

¿Por qué está indefinido “this” en el método “render()” dentro de la subclase?
¿Por qué “this” dentro del constructor de la clase base se refiere al objeto creado en función a la subclase? Quiero conocer el orden de ejecución aquí.

class baseClass {
    constructor() {
        this.render(); // ¿por qué "this" (no this.render()) se refiere al objeto creado en función a derivedClass?
    }

    render() {
        console.log("no se ejecutará.");
    }
}

class derivedClass extends baseClass {
    foo = "foo"
    constructor() {
        super();
        console.log(this); 
    }

    render() {
        console.log(this.foo); // ¿por qué "this" está indefinido?
        alert("renderizado");
    }
}

new derivedClass;
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Cuando se crea el objeto derivedClass, se llama al constructor de la clase base a través de super(). Esto significa que la palabra clave this dentro del constructor de la clase base hace referencia al objeto derivedClass que se está creando, y no al objeto baseClass en sí.

    Sin embargo, el método render() solo está definido en baseClass y no en derivedClass. Cuando se llama al método render() dentro del constructor de la clase base, la palabra clave this sigue haciendo referencia al objeto derivedClass, pero como el método render() no está definido en derivedClass, se produce un error y this queda indefinido en el método render() de derivedClass.

    Para evitar este problema, se recomienda definir también el método render() en derivedClass, de modo que pueda ser llamado desde los objetos baseClass y derivedClass.

Comments are closed.