buenas...
no se a ustedes pero a mi me parece que el asunto viene por la comprehensión de cómo funciona el esquema de prototipos. es por ello que me animo a ofrecer mi versión.
básicamente sucede porque el objeto tiene declarado explícitamente un identificador (propiedad o método). javascript sigue una cadena o camino para la resolución de identificadores. en este caso, comienza por el objeto en sí, luego por su prototipo y continua por el resto de los prototipos según de quién va heredando. si se quiere invocar un método específico de la jerarquía cuando ocurre el conflicto por el nombre de identificador, se debe accesar a dicho método e invocarlo mediante la función
call o
apply:
Código:
function F(a,b){
this.a = a;
this.b = b;
this.m = function(){ return this.a + this.b; };
}
F.prototype.m = function(){ return this.a - this.b; };
var f = new F(0,1);
F.prototype.m.call(f); // método call;
F.prototype.m.apply(f, []); // método apply, si no requiere argumento el segundo parámetro se puede obviar;