2016-05-27 4 views
-1

Я новичок в javascript, который пытается перейти от обработки к javascript.Javascript basic instanciation

Использование Paper.js, я просто пытаюсь понять эквивалент классов и их функций с приведенным ниже кодом, но сохраняю эту ошибку: невозможно прочитать свойство «move» of 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(); 
     } 
    } 

Может кто-нибудь пролить свет? Благодаря !

+2

'prototype' это особое свойство ** функций **. Обычные объекты не имеют этого свойства, поэтому 'Яблоки [i] .prototype'' undefined'. Даже если вы вызвали 'Apples [i] .move()', это не сработало бы, так как объекты, которые вы возвращаете из 'Apple', являются экземплярами' Path.Circle', которые, вероятно, не имеют метода 'move'. Мне непонятно, почему вы делаете 'return this.path' внутри конструктора. Я думаю, вы больше всего выиграете от чтения учебников, таких как http://eloquentjavascript.net/06_object.html и https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript –

+0

@Felix Король: Насколько я знаю, любые значения, возвращаемые конструкторами javascript, игнорируются. –

+1

@Alastair: нет, если объект возвращается. –

ответ

0

Изменить это:

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

к этому:

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

специальный prototype свойство добавляет свойства (в данном случае свойство это функция) для всех будущих экземпляров указанного класса (в ваш случай - класс Apple).

Кроме того, чтобы включить то, что Феликс сказал Смените это:

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

к этому:

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

См. Мой другой комментарий. –