que consigo un resultado inesperado con el siguiente código:Javascript propiedad prototipo no funciona como se esperaba con los campos de objeto y matriz
var TestModel, u, u2;
function TestModel() {}
TestModel.prototype.a = null;
TestModel.prototype.b = [];
u = new TestModel();
u.a = 1;
u.b.push(1);
u2 = new TestModel();
u2.a = 2;
u2.b.push(2);
console.log(u.a, u.b); // outputs: 1 [1,2]
console.log(u2.a, u2.b); // outputs: 2 [1,2]
Me resulta sorprendente que u.b
y u2.b
contienen los mismos valores a pesar de que cada instancia de TestModel
debería tener sus propias variables de instancia según cómo configuré el prototipo. Así que esta es la salida que estaba esperando:
console.log(u.a, u.b); // expecting: 1 [1]
console.log(u2.a, u2.b); // expecting: 2 [2]
Lo mismo sucede si fijo b
ser un objeto y establecer claves en él en lugar de utilizarlo como una matriz. ¿Qué no estoy entendiendo aquí?
Muchas gracias! No estaba al tanto de esa sutil diferencia. Básicamente, debería inicializar todas mis variables de "instancia" en mi constructor antes de manipularlas en otro lugar. – hiddentao
@hiddentao: Exactamente. Está bien asignar tipos primitivos a las propiedades del prototipo, como valores predeterminados, pero los objetos y las matrices deben inicializarse en el constructor si son "por instancia". Normalmente sigo definiendo la propiedad en el prototipo, pero la inicializo con 'null' (como lo hizo con' TestModel.prototype.a'). –
@Felix, ¿qué herramienta usaste para obtener ese buen cuadro de los valores en TestModel? –