2014-11-11 3 views
1

Я делаю простой JS-игру только для практики. Я столкнулся с проблемой, которую я действительно не знаю, как назвать ее. Название может быть совершенно неверным. Но в любом случае, вот мой код.Аксессуар в способе

function Battle() { 
    this.name; 
    this.pointsAmount = 100; 
    this.attack = function attack (opponent) { 
     opponent.pointsAmount -= 30; 
     alert(this.name + " hit " + opponent.name); 
    }; 
}; 

var player1 = new Battle(); 
var player2 = new Battle(); 

// players 
player1.name = "Lorem"; 
player2.name = "Ipsum"; 

player1.attack(player2); 
    alert(player2.name+ ' has lost ' + opponent.pointsAmount + ' points.'); 

Итак, я хотел бы получить доступ к свойству внутри attack функции, которая имеет значение 30. Инструменты разработчика Chrome возвращаются opponent is not defined. Какие-нибудь советы по этому вопросу? Благодарю.

+5

замените 'противника' на' player2' –

+1

'this.name;' ничего не делает. – Scimonster

+1

'pointsAmount' будет 70, а не 30 –

ответ

2

opponent определяется только внутри метода атаки; на него нельзя ссылаться вне этого метода. Вот почему эта линия

alert(player2.name+ ' has lost ' + opponent.pointsAmount + ' points.'); 

не работает. Заменить opponent на player2 (только там).

С другой стороны, по-настоящему нет причин постоянно пересматривать метод атаки снова и снова для каждого игрока. Вы можете определить его таким образом

Battle.prototype.attack = function(opponent) { 
    opponent.pointsAmount -= 30; 
    alert(this.name + " hit " + opponent.name); 
}; 
0

Вы должны сделать что-то вроде:

alert(player2.name+ ' has lost 30 points.'); 

Это хорошо до тех пор, как каждая атака стоит 30 баллов :). В противном случае, если вы хотите сказать, сколько очков player2 оставил делать:

alert(player2.name+ ' has ' + player2.pointsAmount + ' points left.'); 
+0

Если я заменю на player2, я получу значение 70. Но не 30. –

+1

Потому что вы жестко закодированы 30, с каждой атакой игрок всегда будет потерять 30 очков :) –

+1

30 должно быть свойство битвы() –

1

Переменные в JavaScript - это просто указатели на объекты. В вашем примере противник - это просто ссылка на объект player2, поскольку это аргумент, который вы передали функции. Снаружи атаки вы можете просто ссылаться на объект как на игрока2.

alert(player2.name+ ' has lost ' + player2.pointsAmount + ' points.');

1

Если вы хотите получить, сколько очков было потеряно, вы должны что-то вроде ..

var preAmount = player2.pointsAmount; 
player1.attack(player2); 
alert(player2.name+ ' has lost ' + (preAmount - player2.pointsAmount) + ' points.'); 
0

Это мой вариант :-) Я добавил новую переменную pointsLostOnPrevAttack для битвы класс

function Battle() { 
    this.name; 
    this.pointsAmount = 100; 
    this.pointsLostOnPrevAttack; 
    this.attack = function attack (opponent) { 
     opponent.pointsAmount -= 30; 
     opponent.pointsLostOnPrevAttack = 30; 
     alert(this.name + " hit " + opponent.name); 
    }; 
}; 


player1.attack(player2); 
    alert(player2.name+ ' has lost ' + player2.pointsLostOnPrevAttack + ' points and has now '+ player2.pointsAmount + " points left"); 

Теперь он предупреждает "Ipsum потерял 30 очков и имеет 70 очков осталось"