Это не имеет ничего общего с мелкой копией.Вместо этого вы должны понять, как Наследование прототипов работает в мире Javascript.
Чтобы лучше понять, давайте разберем это на две части:
Чтение свойства из дочернего объекта:
Когда вы пытаетесь получить доступ к свойству из дочернего объекта, синтаксический анализатор Javascript будет пытаться выполнить поиск в цепочке прототипов вверх, пока не сможет найти его, иначе будет возвращено неопределенное, если не найдено.
Запись свойства в дочернем объекте
Сначала он попытается определить местонахождение объекта, которому принадлежит целевое свойство, а затем непосредственно установить это свойство для этого объекта..
Давайте рассмотрим часть вашего кода в качестве примера:
bar.details.version = 2.2;
What Javascript parser does:
Во-первых, детали будут обнаружены в результате цепочки прототипов поиска и найдены в foo (то есть: bar.details === foo.details )
Второе, версия непосредственно установлена на детали объект (поэтому this.details.version и this.details.name оба "неожиданно"изменилось, как вы видели в своем результате и в результате bar.details.version === foo.details.version === 2.2 ))
bar.a = 123456;
What Javascript parser does:
Прежде чем что-либо начинать, bar уже находится и не нужно для поиска, хотяВ результате прототип цепочки a будет напрямую установлен на бар (т.е.вот почему только на bar.a влияет foo.a , все еще сохраняющее исходное значение: 123456 )