Причиной такого поведения является то, что вы заставляете foo.prototype
указывать на новый объект при использовании foo.prototype = { y: 2, z: 3};
, и прототипы существующих объектов не изменяются, когда для свойства prototype
конструктора устанавливается новое значение.
Построчное объяснение того, что происходит:
var foo = function(){}
foo.prototype
инициализируется как пустой объект (мы назовем этот объект A
).
fooA = new foo()
fooA
установлен на новый объект foo, его прототип установлен на foo.prototype
(A
).
foo.prototype.x = 1
Поскольку прототип fooA
является тем же объектом, что и foo.prototype
, fooA.x
становится 1. Другими словами, A
получает свойство x = 1
.
foo.prototype = { y: 2, z: 3};
Мы создаем новый объект, который имеет свойства y = 2
и z = 3
. Мы назовем этот объект B
. foo.prototype
установлен для нового объекта.
console.log(fooA.x, fooA.y, fooA.z);
Прототип fooA
по-прежнему A
, который имеет только свойство x = 1
.
fooB = new foo();
Мы создаем новый объект foo, прототип которого B
.
console.log(fooB.x, fooB.y, fooB.z);
Прототипом fooB
является B
, который имеет свойства y = 2
и z = 3
, но не свойство x
.