2010-09-22 1 views
0

Возникает вопрос о oop в js (вопросы в коде ниже).Множественное наследование в 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

Думаю, я должен уточнить свой вопрос: каков недостаток многоуровневости в js? И почему переменная a находится в глобальном масштабе? – plehoux

+2

Тогда поставьте это в вопрос - используйте кнопку редактирования –

ответ

3

Вы должны объявить переменную a с var заявление для того, чтобы сделать его локальным для функции.

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

Вы не можете. Когда вы сделаете это

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

Вы просто изменял объект, который prototype указывает. Так C используется, чтобы наследовать от А, но теперь он наследует от B.

Вы можете поддельной множественное наследование

C.prototype = new A(); 

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

Теперь вы бы свойства/методы из А и В, но вы не» т действительно есть наследство, так как любые изменения в prototype объект B не будет распространяться на C.

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

Multiple наследование не поддерживается JavaScript. Все, что вы сделали, это сделать C наследовать от B, а не A.