Hablando de la herencia de clase de JavaScript, es inevitable que la cadena prototipo no se pueda separar, pero la herencia solo a través de la cadena prototipo tiene muchas deficiencias.
Problema de herencia de no parámetros
Primero veamos una pieza de código de muestra para implementar la herencia B de A:
La copia del código es la siguiente:
función a () {
}
A.prototype.a1 = function () {};
función b () {
}
B.prototype = new a ();
B.prototype.b1 = function () {};
var b = nuevo b ();
alerta (b.constructor == a); // verdadero
alerta (b.constructor == b); // FALSO
Los principales problemas con este código son:
1. A necesita ser instanciado como el prototipo de B, y el constructor de A se ejecuta en este momento. Sin embargo, de acuerdo con las reglas orientadas a objetos, B y su clase principal A no deben ejecutarse antes de instanciar B.
2. Cambió el prototipo de B, lo que resulta en B. -Constructor no B sino A.
Hay un problema con la herencia de la clase de ginseng
Supongamos que A y B tienen dos parámetros de cadena S1 y S2. A calcula la longitud total de las dos cadenas, y B llama directamente a A con S1 y S2 como parámetros:
La copia del código es la siguiente:
Función A (S1, S2) {
this.totallength = s1.length + s2.length;
}
A.Prototype.a1 = function () {
};
función b (s1, s2) {
}
B.prototype = new a ();
B.Prototype.b1 = function () {
};
nuevo B ("AB", "123");
Como puede ver, no hay forma de pasar S1 y S2 a A en este código, y debido a que no hay parámetros al instancias de A como prototipo de B, se produce una excepción:
La copia del código es la siguiente:
S1 está indefinido
Solución
El alcance de S1 y S2 solo está en B. para pasarlos a A, solo puede operar en B. Se puede lograr utilizando el método de aplicación de la función:
La copia del código es la siguiente:
función b (s1, s2) {
A. Aplicar (esto, argumentos);
alerta (this.totallength);
}
La siguiente pregunta es cómo agregar el método A al prototipo B. Esto no es difícil, simplemente pase por A.Prototype y copie el método a B.Prototype. Cabe señalar que para los métodos con el mismo nombre, las subclases son naturalmente preferidas (sobrecargadas), por lo que no se pueden anular:
La copia del código es la siguiente:
para (var m en a.prototype) {
if (! b.prototype [m]) {// Los métodos de clase principal no pueden anular las subclases
B.prototipo [m] = a.prototype [m];
}
}
posdata
Teniendo en cuenta que los idiomas de alto nivel como C# y Java han abandonado la herencia múltiple, la situación de la herencia única se discute en este artículo. El método de herencia descrito en este artículo también se escribirá como una extensión de Jraiser y se publicará más adelante.