Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Конструктор объектов и работа с ними (https://javascript.ru/forum/misc/72626-konstruktor-obektov-i-rabota-s-nimi.html)

Самовар 13.02.2018 09:11

Конструктор объектов и работа с ними
 
Вопрос. Есть конструктор Tank, который создает объекты с определенными свойствами и методами.
function Tank(name,hp,damage){
this.name = name;
this.hp = hp;
this.damage = damage;

this.move = function() {
alert (this.name + ' поехал'  )
}


var T34 = new Tank('Т-34', 1300, 250);
var Tiger = new Tank('Тигр', 2300, 450);


alert (T34.name + ' '+ T34.hp + ' '+ T34.damage);
T34.move();


не получается реализовать функцию
this.attack = function(target){
alert(target.hp);
alert('атаковал ' + target);
alert('нанесено урона ' + this.damage);


идея в том, чтобы создать в конструеторе функцию, которая будет работать для всех объектов танк, где можно указать объект атаки. То есть, чтобы один объект имел доступ к свойству другого объекта и мог их изменять.

рони 13.02.2018 09:51

Самовар,
<script>
function Tank(name,hp,damage){
this.name = name;
this.hp = hp;
this.damage = damage;

this.move = function() {
alert (this.name + ' поехал'  )
}
}

var T34 = new Tank('Т-34', 1300, 250);
var Tiger = new Tank('Тигр', 2300, 450);


alert (T34.name + ' '+ T34.hp + ' '+ T34.damage);
T34.move();
Tank.prototype.attack = function(target){
alert(target.hp);
alert(this.name+' атаковал ' + target.name);
target.hp -= this.damage;
alert('нанесено урона ' + this.damage);
alert(target.name + ' живучесть '+target.hp);
}
T34.attack(Tiger);
  </script>

Самовар 13.02.2018 12:04

Рони, ббольше спасибо. Что-то знакомое с протатипами, обязательно изучу. Но хотелось бы, что функция атаки была описана в костукторе, чтобы все объекты Танк умели ей пользоваться с момента создания, как например метод
this.move = function() {
alert (this.name + ' поехал'  )
}


создал объект танк, а он уже умеет ездить. Но для атаки нужно изменить парметр другого объекта, созданный этим же конструктором, вот с этим проблема. Если туплю извиняйте, я только начал :-?

рони 13.02.2018 12:17

Самовар,
:-? всё что мог смотрите выше.

Nexus 13.02.2018 12:59

Цитата:

Сообщение от Самовар
Но хотелось бы, что функция атаки была описана в костукторе

Методы лучше объявлять в прототипе, чтобы не хранить в памяти реализацию каждого метода для каждого экземпляра класса.
Если нужно будет внести изменения в какой-либо метод, то всегда можно создать другой класс, который будет наследоваться от вашего оригинального и изменять только необходимые методы/свойства.

Самовар 13.02.2018 13:16

Нексус, а можно какой-нибудь пример как это, или ссылку на ресурс, если не сложно

Самовар 13.02.2018 14:22

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

Dilettante_Pro 13.02.2018 14:56

Цитата:

не получается реализовать функцию
Странно... работает
<script>
function Tank(name,hp,damage){
this.name = name;
this.hp = hp;
this.damage = damage;

this.move = function() {
alert (this.name + ' поехал'  )
}
this.attack = function(target){
alert(target.hp);
alert(this.name+' атаковал ' + target.name);
target.hp -= this.damage;
alert('нанесено урона ' + this.damage);
alert(target.name + ' живучесть '+target.hp);
}
}

var T34 = new Tank('Т-34', 1300, 250);
var Tiger = new Tank('Тигр', 2300, 450);


alert (T34.name + ' '+ T34.hp + ' '+ T34.damage);
T34.move();

T34.attack(Tiger);
Tiger.attack(T34);
  </script>


Часовой пояс GMT +3, время: 12:30.