Множественное наследование в JavaScript - PullRequest
0 голосов
/ 22 сентября 2010

Вот несколько вопросов об oop в js (вопросы в коде ниже).

<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>

Ответы [ 3 ]

7 голосов
/ 22 сентября 2010
C.prototype = new A();
C.prototype = new B();

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

6 голосов
/ 22 сентября 2010

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

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

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

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

C.prototype = new A();

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

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

3 голосов
/ 22 сентября 2010

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

function A(){
  var a = 'a - private FROM A()';
  this.a = 'a - public FROM A()';
  this.get_a = function(){
    return a;
  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...