2009-07-30 19 views
5

Quiero crear sub-clase B que hereda de super-clase A. mi código aquí:JavaScript objeto subclase

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

cuando ejecutarlo, se muestran B no está definido.

Respuesta

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

debería ser

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

gracias de antemano. –

+3

antes de lo que –

+7

avance de gracias –

17

debe definir la función B constructor antes de intentar acceder a su 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 aconseja que el próximo reasignar el constructor a B, como sigue.

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

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

¿Hay más detalles aquí? Parece que 'b = new B' no habría tenido éxito a menos que el constructor ya haya sido reasignado. Pero si ya se ha reasignado, ¿por qué la segunda línea para volver a asignarlo explícitamente? –

+0

¿Cómo están Lynda.com y qué me importa lo que dicen? (Estoy de acuerdo con lo que dicen, pero ese no es el punto que deseo abordar). – LeeGee

1

en la derivación de clase estándar, no es el error casi universal de que deriva de una instancia de clase de base recién creado (B.prototype = new A). El constructor de la clase base, al menos, ejecuta código innecesario y, en el peor de los casos, puede bloquearse sin los argumentos de entrada que no deberían tener que crearse artificialmente solo por el bien de la derivación. Además, las funciones de instancia de la instancia de clase base se vuelven parte del prototipo de clases derivadas, que solo es apropiado por pura suerte.

¡Seamos claros! Si heredas de una instancia de clase base creada por el constructor de la clase base (B.prototype = new A), ¡en realidad no heredas directamente de la clase base! ¡Has creado un intermediario en la cadena de herencia, es decir, la instancia de la clase base! ¡¡¡¡Ay!!!! Esto es ineficiente porque hay una profundidad extra en la búsqueda de valores de propiedad heredados en la cadena de herencia. Esta profundidad se acumula cada vez que cometes este error.

Entonces, ¿cuál es la forma correcta. En lugar de B.prototype = new A debe escribir B.prototype = Object.create (A.prototype). Esto puede no haber estado disponible en 09. Sin embargo, en 09 todavía había

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

como sustituto de Object.create. En lugar de B.prototype = new A debe escribir B.prototype = protoProxy (A) en 09;