Javascript "OOP" y prototipos con herencia de múltiples niveles

Soy nuevo en la programación de Javascript y me acerco a mi primera aplicación (un juego, de hecho) desde una perspectiva de programación orientada a objetos (Sé que js no está realmente orientada a objetos, pero para este problema en particular fue más fácil para mí comenzar como esta).

Tengo una jerarquía de "clases" donde la parte superior (clase "Cosa") define una lista de cosas relacionadas (elementos adjuntos en el juego). Es heredado por una clase ThingA que es heredada por las clases ThingA1 y ThingA2.

El ejemplo mínimo sería:

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');

Al final del código, cuando se ejecuta la relación, cada ThingA, ThingA1 y ThingA2 lo ejecutarán (no el último objeto "Thing" de la matriz). Descubrí que si defino la función de relación en el prototipo ThingA, funcionará correctamente. Debido a cómo está diseñado el juego, preferiré no tener que hacer eso.

Tal vez no entiendo algo sobre cómo funcionan los prototipos en javascript. Sé que la función se comparte entre todos los objetos, pero supongo que la ejecución sería individual. ¿Alguien podría explicar por qué sucede esto y cómo resolverlo? No sé si estoy haciendo mal la herencia, o las definiciones de los prototipos, o qué.

Gracias por adelantado.

Respuestas a la pregunta(3)

Su respuesta a la pregunta