Javascript no llama al método del prototipo
Intento sobrescribir un método y el script es:
function wrapper(target) {
target.doABC = function () {
alert('in wrapper');
};
return target;
}
function Model() {
wrapper(this);
}
Model.prototype.doABC = function () {
alert('in Model');
};
var a = new Model();
a.doABC();
El resultado es 'en envoltorio'. No sé por qué.
Respuesta #1
Cualquier objeto de JavaScript tiene propiedades propias y heredadas. Las propias son aquellas definidas directamente en la instancia y las heredadas se toman del objeto prototype.
Al usar un accesor de propiedades, JavaScript primero busca en la lista de propiedades propias del objeto. Si no se encuentra la propiedad, busca en la cadena de prototipos del objeto.
En su ejemplo, el método wrapper() define en la instancia del objeto una propiedad propia doABC, que es una función que muestra una alerta con 'in wrapper'. Incluso si el objeto tiene un prototipo con la misma propiedad doAbc que muestra una alerta con 'in Model', JavaScript de todos modos utilizará la propiedad propia.
function wrapper(target) {
// Define an own property "doABC"
target.doABC = function () {
alert('in wrapper');
};
return target;
}
function Model() {
wrapper(this);
}
// Define an inherited property "doABC"
Model.prototype.doABC = function () {
alert('in Model');
};
var a = new Model();
//Use the own property "doABC". The inherited "doABC" is ignored.
a.doABC();
Como añadido, la propia propiedad puede ser eliminada usando el operador delete. Después de la eliminación, el objeto usará la propiedad heredada.
// delete the own property "doABC"
delete a['doABC'];
// the inherited "doABC" will be used. Alerts "in Model"
a.doABC();
Consulta la demostración completa en funcionamiento.
Respuesta #2
Déjame ver si puedo explicar:
Tienes dos versiones separadas de doABC aquí.
Tu target.doABC crea una función específica para esa instancia de tu Model y cada Model obtiene su propio doABC.
Debido a que Model tiene un doABC, el motor de JavaScript no necesita buscar 'en la cadena' otra cosa, por lo tanto, nunca buscará la versión Model.prototype.doABC.
Puedes ver esto añadiendo estas líneas:
Model.prototype.doXYZ = function () {
alert('in Model');
};
y llamando
a.doXYZ();
Dado que a no tiene su propio doXYZ, entonces, y solo entonces, buscará hacia arriba en la cadena y verá el método en el prototipo.
