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.

Después de usar la palabra clave “this”, ¿por qué JavaScript no se da cuenta de que he especificado una propiedad cuando lo he hecho?

Tengo un objeto que se ve así:

let john = {
    firstName: 'John',
    lastName: 'Smith',
    fullname: `${this.firstName} ${this.lastName}`,
    height: 1.95,
    mass: 92,
    calcBMI: function () {
        this.BMI = this.mass / this.height ** 2;
        return this.BMI
    }
}

Cada vez que accedo a la propiedad fullName, retorna simplemente undefined. Pero cuando la escribo manualmente en el objeto (es decir, fullName: 'John Smith'), obtengo el resultado esperado: John Smith.

Revisé la documentación web de MDN, pero solo encontré algunas frases sobre cómo una expresión como this.miPropiedad podría retornar undefined si se activaba el modo estricto, lo cual estaba activado en mi caso. Pero incluso cuando estaba desactivado, seguía ocurriendo el mismo problema.

¿Alguien podría ayudarme?

P.D: No soy un programador profesional, así que podría ser solo un error por mi parte.

Edit: Cómo llamé a fullName y una duda más sobre mi objeto

Estoy registrando la propiedad fullName en la consola, por si te lo estabas preguntando.

Una cosa más, es posible que hayas notado la función calcBMI en el objeto y que también utiliza la palabra clave this. Me pregunto por qué funciona ahí pero no fuera de ella.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual la propiedad fullName devuelve undefined en lugar del resultado esperado es porque cuando se define el objeto, this dentro de la propiedad fullName se refiere al objeto global (en la mayoría de los casos, el objeto window en un navegador). Por lo tanto, this.firstName y this.lastName son undefined en ese momento, de ahí que la propiedad fullName devuelva undefined.

    Para solucionar este problema, puedes definir la propiedad fullName usando una función getter, que devolverá la cadena concatenada de firstName y lastName cuando se acceda a la propiedad:

    let john = {
        firstName: 'John',
        lastName: 'Smith',
    
        get fullname() {
            return `${this.firstName} ${this.lastName}`;
        },
    
        height: 1.95,
        mass: 92,
    
        calcBMI: function () {
            this.BMI = this.mass / this.height ** 2;
            return this.BMI
        }
    }
    

    En cuanto a tu segunda duda sobre por qué la palabra clave this funciona dentro del método calcBMI pero no fuera de él, es porque cuando se llama al método, this se refiere al objeto mismo (john en este caso), pero fuera del objeto, this se refiere al objeto global. Por lo tanto, si intentas acceder a this.BMI fuera del método calcBMI, será undefined.

Comments are closed.