2017-01-30 2 views
0

Im пытается скопировать pacman на данный момент, и наткнулся на проблему: Так как все Призраки используют одинаковый путь поиска и, как правило, довольно симпатичный, я хочу использовать прототип для них. Единственное свойство, в котором они действительно отличаются, - это путь, они выбирают свою целевую позицию. Я хотел бы дать функцию прототипу и использовать его в качестве геттера. Это возможно?Есть ли способ использовать параметр функции в качестве геттера в прототипе?

function Ghost(color,x,y,getterFunction){ 
    this.color = color; 
    this.x = x; 
    this.y = y; 
    this.direction = "up"; 
    this.move = function(){ 
     //Pathfind towards this.target 
    } 
    this.target = getterFunction; //or something like this... 
} 

Спасибо за вашу помощь: ^)

+0

Нет. Если это то, где они отличаются, это то, что вы делаете * не * хотите надеть прототип. – Bergi

+1

Просто используйте 'this.target()' вместо 'this.target', и ваш код должен работать. – Bergi

+0

Рассматривали ли вы использование класса ES6? Вы можете использовать Babel для перевода кода на работу во всех браузерах. – royalsampler

ответ

3

@Bergi прав. Вы не хотите использовать его в качестве геттера. Если вы попытаетесь добавить его в прототип, он будет перезаписан каждым новым призраком, созданным вами, поскольку прототип является общим объектом.

Прототип предназначен для совместной работы. Функциональность экземпляра принадлежит экземпляру, т. Е. В вашей конструкторской функции.

Ваша функция перемещения должна быть на прототипе. Но цель должна быть методом экземпляра. Вы можете установить метод по умолчанию для прототипа. Любой метод экземпляра будет вызван перед поиском прототипа.

Пример

function Ghost(color, x, y, target){ 
    // everything in here is instance specific 
    this.color = color; 
    this.x = x; 
    this.y = y; 
    this.direction = "up"; 

    if (typeof target === 'function') { 
     this.target = target; 
    } 
} 

// this is the prototype 
Ghost.prototype.move = function() { 
    //Pathfind towards this.target 
    this.target() 
} 

Ghost.prototype.target = function() { 
    // default target to use if no target provided at creation 
} 

Так что теперь, когда вы это делаете:

var redGhost = new Ghost('red', 0, 0, function() { 
    //do something unique 
}) 

Вы будете иметь призрак, что это красный и имеет пользовательский целевой функции. Но если вы это сделаете:

var yellowGhost = new Ghost('yellow', 0, 0) 

У вас будет призрак, который использует целевую функцию по умолчанию, которую вы добавили в прототип.

+1

Это хороший ответ, но он действительно может извлечь выгоду из некоторого примера кода. –

+1

Отредактированный ответ с некоторыми примерами кода. – shadymoses

+0

Теперь этот ответ * awesome *. A +++ снова будет повышаться. –

Смежные вопросы