Operación de propiedades de prototipo en JavaScript.
Quiero añadir un parámetro de prototipo a un objeto de JavaScript que devuelva la suma de otros parámetros.
¿Por qué esto funciona?:
function Item() {
this.a = 2;
this.b = 3;
this.c = this.a + this.b;
}
let it = new Item();
console.log(it.c); //5
¿Y esto no funciona?:
function Item() {
this.a = 2;
this.b = 3;
}
Item.prototype.c = this.a + this.b;
console.log(it.c); // Nan
¿Cómo acceder a una propiedad para poder hacer operaciones en las propiedades de los prototipos?
¿O siempre debo declararlo en el constructor del objeto?
davy.ai
La razón por la cual el primer bloque de código funciona es porque el parámetro
c
se declara y calcula dentro de la función constructoraItem()
, lo que significa que cada vez que se crea una nueva instancia deItem
, el parámetroc
se calcula y se asigna basado en los valores dea
yb
. Esto permite queit.c
genere correctamente la suma dea
yb
, que es 5.Por otro lado, en el segundo bloque de código, el parámetro
c
se establece como una propiedad del objeto prototipoItem
, fuera de la función constructora. En este punto,this
se refiere al objeto global y no a la instancia deItem
. Por lo tanto,this.a
ythis.b
son ambos undefined, lo que resulta enNaN
cuando se llama ait.c
.Para poder acceder a las propiedades en el prototipo y realizar operaciones sobre ellas, puedes utilizar la palabra clave
this
dentro de la función constructora, que se refiere a la instancia deItem
. Por ejemplo:Al definir
c
como una función en el prototipo, podemos acceder a los valores dea
yb
utilizandothis
dentro de la función, lo que devuelve correctamente la suma. De esta forma, podemos realizar operaciones en los valores de las propiedades del prototipo.En última instancia, si necesitas o no declarar propiedades dentro del constructor depende de tu caso de uso específico. Si la propiedad es específica de cada instancia del objeto, debe ser declarada en el constructor. Si la propiedad es compartida entre todas las instancias del objeto, puede ser declarada en el prototipo.