2009-07-30 13 views
5

Chcę utworzyć sub-klasy B, która dziedziczy z super-klasy A. mój kod tutaj:JavaScript obiekt podklasa

function A(){ 
    this.x = 1; 
} 

B.prototype = new A; 
function B(){ 
    A.call(this); 
    this.y = 2; 
} 
b = new B; 
Console.log(b.x + " " + b.y); 

gdy go uruchomić, to pokazać B jest niezdefiniowany.

Odpowiedz

7
B.prototype = new A; 
function B(){ 
    A.call(this); 
    this.y = 2; 
} 

powinny być

function B(){ 
    A.call(this); 
    this.y = 2; 
} 
B.prototype = new A; 
+0

z góry dzięki. –

+3

przed tym, co –

+7

zaliczki dzięki –

17

Musisz zdefiniować funkcję konstruktora B przed próbuje uzyskać dostęp do jego prototyp:

function A(){ 
    this.x = 1; 
} 

function B(){ 
    A.call(this); 
    this.y = 2; 
} 

B.prototype = new A; 

b = new B; 
console.log(b.x + " " + b.y); // outputs "1 2" 
5

Lynda.com przypomina, że ​​obok przypisać konstruktora do B, następująco.

function B() { 
    A.call(this); 
    this.y = 2; 
} 

B.prototype = new A; 
B.prototype.constructor = B; 
+0

Więcej szczegółów tutaj? Wygląda na to, że 'b = nowy B' nie powiedzie się, chyba że konstruktor został już przypisany. Ale jeśli jest już przypisany, dlaczego druga linia powinna ponownie zmienić przypisanie? –

+0

Co to jest Lynda.com i co mnie obchodzi to, co mówią? (Zgadzam się z tym, co mówią, ale nie o to mi chodzi.) – LeeGee

1

W standardowej klasy wyprowadzenie, jest prawie uniwersalny błędem wynikającym z nowo utworzonego klasy bazowej przykład (B.prototype = nowy a). Konstruktor klasy podstawowej wykonuje co najmniej niepotrzebny kod iw najgorszym wypadku może się zawiesić bez argumentów wejściowych, które nie powinny być sztucznie tworzone tylko w celu wyprowadzenia. Co więcej, funkcje instancji instancji klasy bazowej stają się częścią prototypów klas pochodnych, co jest odpowiednie tylko w przypadku zwykłego szczęścia.

Pozwala być jasne! Jeśli dziedziczysz z instancji klasy bazowej utworzonej przez konstruktor klasy podstawowej (B.prototype = new A), to nie dziedziczysz bezpośrednio z klasy bazowej !! Utworzono pośrednika w łańcuchu dziedziczenia, a mianowicie instancję klasy podstawowej !!! Oooo !!!! Jest to nieefektywne, ponieważ istnieje dodatkowa głębia w wyszukiwaniu dziedziczonych wartości właściwości w łańcuchu dziedziczenia. Ta głębokość gromadzi się za każdym razem, gdy popełniasz ten błąd.

Więc jaki jest właściwy sposób. Zamiast B.prototype = new A powinieneś napisać: B.prototype = Object.create (A.prototype). To może nie być dostępny w 09. Jednak w 09 wciąż było

protoProxy = function(myClass) 
{ 
    function foo(){}; 
    foo.prototype = myClass.prototype; 
    return new foo(); 
} 

jako substytut Object.create. Zamiast B.prototype = new A powinieneś napisać: B.prototype = protoProxy (A) w 09;

Powiązane problemy