2010-09-22 17 views
0

Voici une question à propos de oop in js (questions dans le code ci-dessous).Héritage multiple en javascript

<html> 
    <script> 
    function A(){ 
     a = 'a - private FROM A()'; 
     this.a = 'a - public FROM A()'; 
     this.get_a = function(){ 
     return a; 
     } 
    } 

    function B(){ 
     this.b = 'b - private FROM B()'; 
     this.a = 'a - public FROM B() '; 
    } 

    C.prototype = new A(); 
    C.prototype = new B(); 
    C.prototype.constructor = C; 
    function C() { 
     A.call(this); 
     B.call(this); 
    } 

    var c = new C(); 

    //I've read paper about oop in Javacscript but they never talk 
    //(the ones have read of course) about multiple inheritance, any 
    //links to such a paper? 

    alert(c.a); 
    alert(c.b); 
    alert(c.get_a()); 

    //but 

    //Why the hell is variable a from A() now in the Global object? 
    //Look like C.prototype = new A(); is causing it. 

    alert(a); 

    </script> 
</html> 
+0

Je suppose que je devrais clarifier ma question: Quels sont les inconvénients de l'héritage multiple dans js? Et pourquoi la variable a est-elle globale? – plehoux

+2

Ensuite, mettez cela dans la question - utilisez le bouton d'édition –

Répondre

3

Vous devez déclarer la a variable avec la déclaration var afin de le rendre à la fonction locale.

function A(){ 
    var a = 'a - private FROM A()'; 
    this.a = 'a - public FROM A()'; 
    this.get_a = function(){ 
    return a; 
    }; 
} 
6

Vous ne pouvez pas. Lorsque vous faites cela

C.prototype = new A(); 
C.prototype = new B(); 

Vous changez simplement l'objet prototype points. Ainsi, C utilisé pour hériter de A, mais maintenant il hérite de B.

Vous pouvez faux héritage multiple

C.prototype = new A(); 

for (var i in B.prototype) 
    if (B.prototype.hasOwnProperty(i)) 
    C.prototype[i] = B.prototype[i]; 

Maintenant, vous auriez les propriétés/méthodes de A et B, mais vous n » t ont vraiment l'héritage, étant donné que toute modification apportée à l'objet prototype de B ne se propage pas à C.

7
C.prototype = new A(); 
C.prototype = new B(); 

inheritence multiples ne sont pas pris en charge javascript. Tout ce que vous avez fait, c'est que C hérite de B au lieu de A.