Maison  >  Article  >  interface Web  >  Solutions aux problèmes d'héritage de classe paramétré et sans paramètre Javascript_compétences Javascript

Solutions aux problèmes d'héritage de classe paramétré et sans paramètre Javascript_compétences Javascript

WBOY
WBOYoriginal
2016-05-16 16:11:391022parcourir

En ce qui concerne l'héritage de classe Javascript, il doit être indissociable de la chaîne de prototypes, mais l'héritage implémenté uniquement via la chaîne de prototypes présente de nombreux défauts.

Problèmes avec l'héritage de classe sans paramètre

Regardons d'abord un exemple de code pour implémenter B héritant de A :

Copier le code Le code est le suivant :

fonction A() {
>
A.prototype.a1 = function() { };

fonction B() {
>
B.prototype = nouveau A();
B.prototype.b1 = function() { };

var b = nouveau B();
alert(b.constructor == A); // vrai
alert(b.constructor == B); // false


Le principal problème avec ce code est :

1. A doit être instancié en tant que prototype de B. A ce moment, le constructeur de A est exécuté. Mais selon les règles orientées objet, avant d'instancier B, les constructeurs de B et sa classe parent A ne doivent pas être exécutés.

2. Modification du prototype de B, ce qui fait que b.constructor n'est pas B mais A.

Il y a un problème avec l'héritage de classe de paramètres

Supposons que A et B aient deux paramètres de chaîne s1 et s2. A calcule la longueur totale des deux chaînes B appelle directement A avec s1 et s2 comme paramètres :

Copier le code Le code est le suivant :

fonction A(s1, s2) {
​this.totalLength = s1.length s2.length;
>
A.prototype.a1 = fonction() { 
};

fonction B(s1, s2) {
>
B.prototype = nouveau 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 comme il n'y a aucun paramètre lors de l'instanciation de A comme prototype de B, une exception se produit :
Copier le code Le code est le suivant :

s1 n'est pas défini

Solution

La portée de s1 et s2 est uniquement en B. Si vous souhaitez les transférer vers A, vous ne pouvez opérer qu'en B. Ceci peut être réalisé à l'aide de la méthode apply de la fonction :

Copier le code Le code est le suivant :

fonction B(s1, s2) {
A.apply(this, arguments);
alert(this.totalLength);
>

La question suivante est de savoir comment ajouter la méthode de A au prototype de B. Ce n'est pas difficile, il suffit de parcourir A.prototype et de copier la méthode dans B.prototype. Il est à noter que pour les méthodes du même nom, les sous-classes sont naturellement prioritaires (surcharge), elles ne peuvent donc pas être surchargées :
Copier le code Le code est le suivant :

pour (var m dans A.prototype) {
​if (!B.prototype[m]) { // La classe parent ne peut pas remplacer la méthode de la sous-classe
​B.prototype[m] = A.prototype[m];
}
>

Post-scriptum

Considérant que les langages de haut niveau tels que C# et Java ont abandonné l'héritage multiple, cet article ne traite que de l'héritage unique. La méthode d'héritage décrite dans cet article sera également écrite comme une extension de jRaiser et sera publiée ultérieurement.

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn