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.
davy.ai
La razón por la cual la propiedad
fullName
devuelveundefined
en lugar del resultado esperado es porque cuando se define el objeto,this
dentro de la propiedadfullName
se refiere al objeto global (en la mayoría de los casos, el objeto window en un navegador). Por lo tanto,this.firstName
ythis.lastName
sonundefined
en ese momento, de ahí que la propiedadfullName
devuelvaundefined
.Para solucionar este problema, puedes definir la propiedad
fullName
usando una función getter, que devolverá la cadena concatenada defirstName
ylastName
cuando se acceda a la propiedad:En cuanto a tu segunda duda sobre por qué la palabra clave
this
funciona dentro del métodocalcBMI
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 athis.BMI
fuera del métodocalcBMI
, seráundefined
.