Javascript «ООП» и прототипы с многоуровневым наследованием

Я новичок в программировании на 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');

В конце кода, когда выполняется relteThing, все ThingA, ThingA1 и ThingA2 будут выполнять его (а не последний объект Thing в массиве). Я обнаружил, что если я определю функцию relteThing в прототипе ThingA, она будет работать правильно. Из-за того, как игра разработана, я предпочитаю не делать этого.

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

Заранее спасибо.

Ответы на вопрос(3)

Ваш ответ на вопрос