2009-07-30 6 views
5

Voglio creare sotto-classe B che eredita da super-classe A. mio codice qui:JavaScript oggetto sottoclasse

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

quando viene eseguito, esso mostrano B è indefinito.

risposta

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

dovrebbe essere

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

grazie in anticipo. –

+3

in anticipo di quanto –

+7

anticipo di ringraziamenti –

17

È necessario definire la funzione B costruttore prima di tentare di accedere al suo prototipo:

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 informa che la prossima riassegnare il costruttore a B, come segue.

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

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

Altri dettagli qui? Sembra che 'b = new B' non avrebbe avuto successo a meno che il costruttore non fosse già stato riassegnato. Ma se è già riassegnato, perché la seconda linea lo riassegna esplicitamente? –

+0

Come sono Lynda.com e cosa mi interessa cosa dicono? (Sono d'accordo con quello che dicono, ma non è questo il punto che desidero affrontare). – LeeGee

1

In derivazione classe standard, v'è l'errore quasi universale di derivare da un'istanza classe base appena creata (B.prototype = new A). Il costruttore della classe base esegue perlomeno codice non necessario e, nel peggiore dei casi, potrebbe bloccarsi senza gli argomenti di input che non dovrebbero essere creati artificialmente solo per motivi di derivazione. Inoltre, le funzioni di istanza dell'istanza della classe base diventano parte del prototipo delle classi derivate, che è appropriato solo per pura fortuna.

Sia chiaro! Se si eredita da un'istanza della classe base creata dal costruttore della classe base (B.prototype = new A) in realtà non si eredita direttamente dalla classe base !! Hai creato un intermediario nella catena ereditaria, ovvero l'istanza della classe base !!! Ahia!!!! Questo è inefficiente perché c'è una maggiore profondità nella ricerca di valori di proprietà ereditate nella catena di ereditarietà. Questa profondità si accumula ogni volta che commetti questo errore.

Quindi qual è il modo corretto. Invece di B.prototype = new A dovresti scrivere B.prototype = Object.create (A.prototype). Questo non può essere stato disponibile in 09. Tuttavia, in 09 non era ancora

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

come un sostituto per Object.create. Invece di B.prototype = new A dovresti scrivere B.prototype = protoProxy (A) in 09;