Вы смешиваете свойства прототипа со свойствами, локальными для экземпляра объекта. Используя y.bar = 2
, вы назначаете свойство экземпляра (bar
) для экземпляра y
. При интерпретации свойства (bar
) сначала ищется внутри самого экземпляра. Если он там не найден, поиск продолжается в прототипе экземпляров. Теперь вы присвоили bar
y
, поэтому y.bar = 2
, но экземпляр x
не знает об этом, поэтому для x
поиск продолжается с использованием своего прототипа (это prototype.bar
, все еще со значением 1).
Для y.foo.a
в y
отсутствует свойство экземпляра foo
, поэтому оно было найдено в его прототипе. Там он найден, и свойству a
назначено новое значение. Так как вы изменяете значение свойства Class.prototype
foo
, оно также отображается в x
.
Если вы хотите изменить гриф в его прототипе (например, из экземпляра y
), вам придется использовать прототип y
constructor
(то есть Class
):
y.constructor.prototype.bar = 2;
Может г-н Дуглас Крокфорд может прояснить для вас вещи (пройдите примерно до 23 минуты в видео для наследования прототипа)?