Falando na herança da classe de JavaScript, é inevitável que a cadeia de protótipos não possa ser separada, mas a herança somente através da cadeia de protótipo tem muitas deficiências.
Problema de herança de nenhum parâmetros
Vamos primeiro olhar para um código de amostra para implementar a herança B de A:
A cópia do código é a seguinte:
função a () {
}
A.prototype.a1 = function () {};
função b () {
}
B.prototype = novo a ();
B.prototype.b1 = function () {};
var b = novo b ();
alerta (b.constructor == a); // verdadeiro
alerta (b.constructor == b); // false
Os principais problemas com este código são:
1. A precisa ser instanciado como protótipo de B, e o construtor de A é executado no momento. No entanto, de acordo com as regras orientadas a objetos, B e sua classe A dos pais A não devem ser executados antes de instantar B.
2. Mudou o protótipo de B, resultando em B.Constructor não B, mas A.
Há um problema com a herança da classe Ginseng
Suponha que A e B tenham dois parâmetros de sequência S1 e S2. A calcula o comprimento total das duas cordas e B chama diretamente a com S1 e S2 como parâmetros:
A cópia do código é a seguinte:
função a (s1, s2) {
this.TotalLength = S1.Length + S2.Length;
}
A.prototype.a1 = function () {
};
Função B (S1, S2) {
}
B.prototype = novo a ();
B.prototype.b1 = function () {
};
novo B ("AB", "123");
Como você pode ver, não há como passar S1 e S2 para A neste código e, como não há parâmetros ao instanciar A como o protótipo de B, ocorre uma exceção:
A cópia do código é a seguinte:
S1 é indefinido
Solução
O escopo de S1 e S2 é apenas em B. Para passar para A, você só pode operar em B. Ele pode ser alcançado usando o método Aplicação da função:
A cópia do código é a seguinte:
Função B (S1, S2) {
A. Aplicar (isso, argumentos);
alerta (this.Totallength);
}
A próxima pergunta é como adicionar o método A ao protótipo B. Isso não é difícil, basta passar por A.Prototype e copiar o método para B.Prototype. Deve -se notar que, para métodos com o mesmo nome, as subclasses são naturalmente preferidas (sobrecarregadas), para que não possam ser substituídas:
A cópia do código é a seguinte:
para (var m em a.prototype) {
if (! b.prototype [m]) {// Métodos da classe pai não puder substituir as subclasses
B. prototipo [M] = A.Prototype [M];
}
}
PostScript
Considerando que idiomas de alto nível, como C# e Java, abandonaram a herança múltipla, a situação de herança única é discutida neste artigo. O método de herança descrito neste artigo também será escrito como uma extensão do Jraiser e será lançado posteriormente.