Способ, которым это работает, заключается в том, что сначала свойства ищутся на объекте, а затем, если они не найдены, путем поиска их в прототипе.
Если я попытаюсь объяснить этокажется, что изначально экземпляр не имеет своего собственного свойства num, и поиск происходит там, где он обнаружен в прототипе, но как только вы фактически устанавливаете свойство (внутренне с this.num или внешне с instanceName.num), вы создаете свойстводля instance.property для экземпляра.
Именно так оно и работает.Если вы хотите удалить свойство, установленное для объекта, вы можете использовать delete:
delete myOtherObj.num;
, это удалит свойство num myOtherObj и позволит прототипу показывать версию.
Часть спецификации, которую вы цитировали, пытается объяснить, как устанавливается внутреннее свойство [[Prototype]] для вновь создаваемых экземпляров.Помимо своей роли в поиске свойств, [[Prototype]] похож на любую другую ссылку на объект Javascript.
Таким образом, когда свойство «prototype» конструктора «копируется» в [[Prototype]] для вновь созданного объекта, оно фактически получает ссылку на исходное свойство prototype в конструкторе, которое можетбудут изменены позже.
В качестве другого примера:
function Obj() {};
Obj.prototype.num=1;
var myObj = new Obj();
console.log(myObj.num); // logs 1
Obj.prototype = {num:3}; // replaces Obj.prototype
console.log(myObj.num); // logs 1
var myOtherObj = new Obj();
console.log(myOtherObj.num); // logs 3
console.log(myObj.num); // still logs 1
Обратите внимание, что после того, как объект был построен, он сохраняет ссылку на любой объект, который был установлен в качестве прототипа конструктора в то время конструктор назывался .Изменение свойства этого объекта будет по-прежнему влиять на любые другие ссылки на тот же прототип.