2016-05-27 2 views
-1

Je suis un novice javascript qui essaie de passer du traitement au javascript.Javascript instanciation de base

En utilisant Paper.js, j'essaie simplement de comprendre l'équivalent des classes et de leurs fonctions avec le code ci-dessous mais je continue à avoir cette erreur: Impossible de lire la propriété 'move' de undefine.

function Apple (center) { 
     this.color = 'red'; 
     this.center = center; 
     this.path = new Path.Circle(this.center, 50); 
     this.path.fillColor = 'black'; 
     return this.path; 
    } 

    Apple.prototype.move = function(){ 
     console.log('allo'); 
    } 

var Apples = []; 
var nbA = 10; 

for(var i=0; i < nbA; i++){ 
    var center = new Point.random() * view.size;  
    Apples.push(new Apple(center)); 
} 

function onFrame(event){ 
    for(var i=0; i < Apples.length; i++){ 
     Apples[i].prototype.move(); 
     } 
    } 

Quelqu'un peut-il jeter de la lumière? Merci !

+2

'prototype' est une propriété spéciale de fonctions ** **. Les objets normaux n'ont pas cette propriété, donc 'Apples [i] .prototype' est' undefined'. Même si vous appelez 'Apples [i] .move()' cela ne fonctionnerait pas, puisque les objets que vous retournez de 'Apple' sont des instances de' Path.Circle', qui n'ont probablement pas de méthode 'move'. Ce n'est pas clair pour moi pourquoi vous faites 'return this.path;' dans le constructeur. Je pense que vous bénéficieriez le plus de la lecture des tutoriels tels que http://eloquentjavascript.net/06_object.html et https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript –

+0

@Felix King: Pour autant que je sache, les valeurs renvoyées par les constructeurs javascript sont ignorées. –

+1

@Alastair: Pas si un objet est retourné. –

Répondre

0

Modifier ceci:

function onFrame(event){ 
    for(var i=0; i < Apples.length; i++){ 
     Apples[i].prototype.move(); 
     } 
    } 

à ceci:

function onFrame(event){ 
    for(var i=0; i < Apples.length; i++){ 
     Apples[i].move(); 
     } 
    } 

la propriété prototype spéciale ajoute des propriétés (dans ce cas, une propriété qui est une fonction) à toutes les instances futures de la classe spécifiée (en votre cas, la classe Apple).

De plus, pour intégrer ce que Felix a dit changement ceci:

function Apple (center) { 
     this.color = 'red'; 
     this.center = center; 
     this.path = new Path.Circle(this.center, 50); 
     this.path.fillColor = 'black'; 
     return this.path; 
    } 

à ceci:

function Apple (center) { 
     this.color = 'red'; 
     this.center = center; 
     this.path = new Path.Circle(this.center, 50); 
     this.path.fillColor = 'black'; 
    } 
+1

Voir mon autre commentaire. –