Héritage sur javascript, variables dans le "parent"

Je fais OO javascript pour la première fois. J'ai lu sur l'héritage et le prototype et j'ai pensé que je l'avais cassé. Jusqu'à ce que je découvre ce petit exemple.

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 je fais ce qui suit:

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

Je m'attends à ce que la console montre:

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

Cependant, cela montre:

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

Le problème est évidemment cet appel:

 TestObject2.prototype = new TestObject(); 

Comment puis-je obtenir les variables parent dans TestObject pour "réinitialiser" autrement que de les réinitialiser manuellement dans la méthode __construct?

Existe-t-il une autre façon de TestObject2 d'hériter de toutes les valeurs / méthodes de TestObject et de «nouveau» pour se comporter comme je l'espérer d'une manière PHP OO? (Je suis sûr que la façon dont JS le fait est vraiment très étrange, comme si mon cerveau me servait correctement à partir de Java d'Université fonctionne comme PHP à cet égard)

En gros

 TestObject2.prototype = new TestObject(); 

Place une instance unique de TestObject dans la chaîne prototype de TestObject2. Ainsi, toutes les instances de TestObject2 modifieront la même propriété de déclenchement d'instance unique dans TestObject. Si vous placez une autre console.log dans la version de TestObject, vous constaterez qu'elle ne reçoit qu'une seule fois.

Vous trouverez plus de détails sur votre problème exact ici .

Vous devez appeler le constructeur de TextObject à partir du constructeur de TextObject2 comme ceci:

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

En appelant la fonction de constructeur TestObject et en l'exécutant dans la portée (c'est-à-dire) le nouvel objet TestObject2, il crée tous les éléments de TestObject dans l'objet TestObject2.

Avez-vous déjà essayé de définir this.clone_array = []; Dans le cadre de TestObject2?

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

je pense

 TestObject2.prototype = new TestObject(); 

Dépasse le constructeur de TestObject2.

essayer

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