En parlant de l'héritage de la classe de JavaScript, il est inévitable que la chaîne prototype ne puisse pas être séparée, mais l'héritage uniquement par la chaîne prototype a de nombreuses lacunes.
Problème de l'héritage sans paramètres
Regardons d'abord un exemple de code pour implémenter l'héritage B à partir de A:
La copie de code est la suivante:
fonction a () {
}
A.prototype.a1 = fonction () {};
fonction b () {
}
B.Prototype = new A ();
B.prototype.b1 = fonction () {};
var b = new b ();
alerte (B.Contructor == A); // vrai
alerte (B.Contructor == B); // FAUX
Les principaux problèmes de ce code sont:
1. A doit être instancié en tant que prototype de B, et le constructeur de A est exécuté pour le moment. Cependant, selon les règles orientées objet, B et sa classe A Parent A ne doivent pas être exécutés avant d'instancier B.
2. Changé le prototype de B, résultant en B.Contructrice non B mais A.
Il y a un problème avec l'héritage de la classe de ginseng
Supposons que A et B aient deux paramètres de chaîne S1 et S2. A calcule la longueur totale des deux chaînes et B appelle directement A avec S1 et S2 comme paramètres:
La copie de code est la suivante:
fonction a (s1, s2) {
this.totallength = s1.length + s2.Length;
}
A.prototype.a1 = fonction () {
};
fonction b (s1, s2) {
}
B.Prototype = new A ();
B.prototype.b1 = fonction () {
};
Nouveau B ("AB", "123");
Comme vous pouvez le voir, il n'y a aucun moyen de passer S1 et S2 à A dans ce code, et parce qu'il n'y a pas de paramètres lors de l'instanciation de A comme prototype de B, une exception se produit:
La copie de code est la suivante:
S1 n'est pas défini
Solution
La portée de S1 et S2 est uniquement en B. pour les transmettre à A, vous ne pouvez opérer qu'en B. Il peut être réalisé en utilisant la méthode d'application de la fonction:
La copie de code est la suivante:
fonction b (s1, s2) {
A. s'appliquer (ceci, arguments);
alert (this.totallength);
}
La question suivante est de savoir comment ajouter la méthode A au prototype B. Ce n'est pas difficile, passez simplement par A.Protype et copiez la méthode sur B.Protype. Il convient de noter que pour les méthodes du même nom, les sous-classes sont naturellement préférées (surchargées), de sorte qu'elles ne peuvent pas être remplacées:
La copie de code est la suivante:
pour (var m dans a.prototype) {
if (! b.prototype [m]) {// Les méthodes de classe parent ne peuvent pas remplacer les sous-classes
B.Prototype [m] = a.prototype [m];
}
}
post-scriptum
Étant donné que les langues de haut niveau telles que C # et Java ont abandonné l'héritage multiple, la situation de l'héritage unique est discutée dans cet article. La méthode d'héritage décrite dans cet article sera également écrite comme une extension de Jraiser et sera publiée plus tard.