2010-10-18 19 views
9

Estoy haciendo OO javascript por primera vez. He leído sobre herencia y prototipo y pensé que lo había descifrado. Hasta que descubrí este pequeño ejemplo.Herencia en javascript, variables en el "padre"

function TestObject(data) 
{ 
    this.test_array = []; 
    this.clone_array = []; 

    this.dosomestuff = function() 
    { 
     for(var i=0; i<this.test_array.length; i++) 
     { 
      this.clone_array[i]=this.test_array[i]; 
     } 
    } 

    this.__construct = function(data) 
    { 
     console.log("Testing Object Values" ,this.clone_array); 
     this.test_array = data; 
    }; 
} 

TestObject2.prototype = new TestObject(); 

function TestObject2(data) 
{ 
    this.__construct(data); 
    this.dothings = function() 
    { 
     this.dosomestuff(); 
    } 
} 

Si hago lo siguiente:

var foo = new TestObject2([1,2,3,4]); 
foo.dothings(); 
var bar = new TestObject2([4,5,6]); 
bar.dothings(); 

Yo esperaría que la consola para mostrar:

Testing Object Values, [] 
Testing Object Values, [] 

Sin embargo se nota:

Testing Object Values, [] 
Testing Object Values, [1,2,3,4] 

El problema es de Por supuesto esta llamada:

TestObject2.prototype = new TestObject(); 

¿Cómo puedo obtener que las variables primarias en TestObject se "reinicien", además de restablecerlas manualmente en el método __construct?

¿Hay alguna otra forma de TestObject2 de heredar todos los valores/métodos de TestObject y de "nuevo" para comportarse como esperaría de una manera PHP OO? (Estoy seguro de que la manera en que JS está haciendo esto es muy extraño, como si mi cerebro me funcionara correctamente desde la Universidad Java funciona como PHP)

+0

Demo aquí: http://jsbin.com/olino3 – johnwards

Respuesta

10

Básicamente

TestObject2.prototype = new TestObject(); 

lugares una sola instancia de TestObject en la cadena de prototipo TestObject2. Por lo tanto, cualquier instancia de TestObject2 modificará la misma propiedad de descendencia de instancia en TestObject. Si coloca otro console.log en el constructor de TestObject, ¡notará que solo recibe una llamada!

Más detalles a su problema exacto se pueden encontrar here.

es necesario llamar al constructor de ObjetoDeTexto desde dentro del constructor de TextObject2 así:

function TestObject2(data) 
{ 
    TestObject.call(this, data); 
    this.__construct(data); 
    this.dothings = function() 
    { 
     this.dosomestuff(); 
    } 
} 

Al llamar a la función TestObject constructor y ejecutarlo en el ámbito de (esto es) el nuevo objeto TestObject2, crea todos los elementos de TestObject en el objeto TestObject2.

+0

Excelente, exactamente lo que estaba buscando. ¡También ten una votación! – johnwards

+0

Doh, olvidé todo acerca de la llamada al constructor heredado. Buen ojo. – JoshNaro

0

¿Ya has intentado definir this.clone_array = []; en TestObject2?

function TestObject2(data) 
{ 
    this.clone_array = []; 
    this.__construct(data); 
    this.dothings = function() 
    { 
     this.dosomestuff(); 
    } 
} 
+0

Tengo 30 variables en mi padre. Estoy extendiendo el padre en 3 clases diferentes. Tendría que copiar y pegar el reinicio en estas 30 clases. Asqueroso. Sería mejor que los pusiera en un reinicio. – johnwards

0

creo

TestObject2.prototype = new TestObject(); 

es reemplazar el constructor de TestObject2.

Trate

function TestObject2(data) 
{ 
    TestObject.call(this, data); 
    this.__construct(data); 
    this.dothings = function() 
    { 
     this.dosomestuff(); 
    } 
} 


TestObject2.prototype = new TestObject(); 
TestObject2.prototype.constructor = TestObject2; 
+0

No, no hay diferencia. Ver: http://jsbin.com/olino3/3 – johnwards