Хорошо, я разобрался с проблемой. Код моего исходного вопроса не был точным, поэтому я прошу прощения у других респондентов (они были верны в контексте кода, который я представил).
Решение описано здесь:
Члены объекта Javascript, созданные в виде массивов, становятся общими для всех экземпляров класса
По сути, тот факт, что оба экземпляра Child совместно используют в качестве своего прототипа одну и ту же функцию AbstractParent, означает, что изменение чего-либо в AbstractParent будет отражено в обоих дочерних прототипах.
Причина, по которой это проявляется только при использовании массива, заключается в том, что я инициализировал массив в прототипе, а затем просто изменил его, а не переписал в функции addDetail
. Когда я использовал объекты или строки для имен свойств, а затем выполнил присваивание, this
в контексте во время вызова функции принадлежит экземпляру Child, поэтому выполнение this.name = 'Billy';
в функции AbstractParent фактически присоединяет вместо экземпляра Child, а не в AbstractParent. Я думал, что каждый экземпляр Child получит свой собственный экземпляр прототипа AbstractParent, и когда я получу доступ к this.name, он не найдет его в Child и вместо этого перейдет к this.prototype.name
.
В коде моего вопроса я могу это исправить, добавив функцию initialize
в AbstractParent, которая создает массив деталей. Но если бы я добавил функцию initialize
в Child, и я бы не вызвал в ней родительский конструктор, у меня возникла бы та же проблема, что и раньше.