Я новичок в программировании Javascript, и я приближаюсь к своему первому приложению (игра, действительно) с точки зрения объектно-ориентированного программирования (я знаю, что js не является объектно-ориентированным, но для этой конкретной проблемы мне было легче чтобы начать так).
У меня есть иерархия "классов", где самый верхний (класс "Thing" ) определяет список связанных вещей (прикрепленные элементы в игре). Он унаследован классом ThingA, который наследуется классами ThingA1 и ThingA2.
Минимальным примером может быть:
function Thing()
{
this.relatedThings = [];
}
Thing.prototype.relateThing = function(what)
{
this.relatedThings.push(what);
}
ThingA.prototype = new Thing();
ThingA.prototype.constructor = ThingA;
function ThingA()
{
}
ThingA1.prototype = new ThingA();
ThingA1.prototype.constructor = ThingA1;
function ThingA1()
{
}
ThingA2.prototype = new ThingA();
ThingA2.prototype.constructor = ThingA2;
function ThingA2()
{
}
var thingList = [];
thingList.push(new ThingA());
thingList.push(new ThingA1());
thingList.push(new ThingA2());
thingList.push(new ThingA2());
thingList.push(new Thing());
thingList[1].relateThing('hello');
В конце кода, когда выполняется relateThing, каждый ThingA, ThingA1 и ThingA2 собираются выполнить его (а не последний объект Thing в массиве). Я нашел, если я определяю функцию relateThing в прототипе ThingA, он будет работать правильно. Из-за того, как разрабатывается игра, я предпочел бы не делать этого.
Возможно, я не понимаю, как работают прототипы в javascript. Я знаю, что функция распределяется между всеми объектами, но я предполагаю, что выполнение будет индивидуальным. Может ли кто-нибудь объяснить, почему это происходит и как его решить? Я не знаю, ошибаюсь ли я наследование, или определения прототипов, или что.
Спасибо заранее.