Дело в том, что с прототипами вы можете читать их целый день, и это не изменит основную структуру того, что указывает на что. Однако при первом выполнении назначения вы заменяете этот экземпляр тем, на что указывает это свойство.
В вашем случае вы фактически не переназначали свойство прототипа, вы изменили значение базовой структуры, найденной в этом свойстве.
Это означает, что все объекты, которые совместно используют прототип A, фактически разделяют реализацию A. Это означает, что любое состояние, переносимое в A, будет найдено во всех экземплярах B. В тот момент, когда вы выполните присваивая это свойство экземпляру B, вы фактически заменили то, на что указывает этот экземпляр (и только этот экземпляр) (я полагаю, это связано с тем, что в B есть новое свойство "name", которое попадает в область действия цепочка, прежде чем она достигнет реализации "name" в A).
EDIT:
Чтобы дать более явный пример того, что происходит:
B.prototype = new A();
var obj1 = new B();
Теперь, когда мы впервые читаем, интерпретатор делает что-то вроде этого:
obj1.name;
Интерпретатор: «Мне нужно имя свойства. Во-первых, проверьте, что Б. не имеет« имени », поэтому давайте продолжим цепочку областей действия. Далее, А. Ага! А имеет« имя », вернем это»
Однако, когда вы делаете запись, интерпретатор фактически не заботится о унаследованном свойстве.
obj1.name = "Fred";
Интерпретатор: «Мне нужно присвоить свойству« имя ». Я нахожусь в области действия этого экземпляра из B, поэтому присваиваем 'Fred' B. Но я оставляю все остальное дальше вниз по одна цепочка области действия (т. е. A) "
Теперь, в следующий раз, когда вы прочитаете ...
obj1.name;
Интерпретатор: «Мне нужно свойство 'name'. Ага! В этом экземпляре объекта B уже есть свойство 'name'. Просто верните его - мне все равно, область видимости (т.е. имя А.) "
Итак, в первый раз, когда вы пишете в name, он вставляет его как свойство первого класса в экземпляре, и его больше не волнует, что на AAname - это , все еще там , это просто дальше вниз по цепочке контекста, и интерпретатор JS не продвинется так далеко, пока не найдет то, что искал.
Если бы «name» имело значение по умолчанию в A (как у вас, которое есть «A»), то вы бы увидели это поведение:
B.prototype = new A();
var obj1 = new B();
var obj2 = new B();
obj1.name = "Fred";
alert(obj1.name); // Alerts Fred
alert(obj2.name); // Alerts "A", your original value of A.name
Теперь, в случае с вашим массивом, вы на самом деле не заменили список в цепочке областей новым массивом. То, что вы сделали, это взяли дескриптор самого массива и добавили к нему элемент. Следовательно, все случаи B затронуты.
Интерпретатор: "Мне нужно получить свойство 'list' и добавить в него элемент. Проверка этого экземпляра B ... nope, не имеет свойства" list ". Следующее в цепочке областей: A. Да, у А есть «список», используйте его. Теперь нажмите на этот список "
Это будет не , если бы вы сделали это:
obj1.list = [];
obj1.push(123);