Я думаю, что понял.
Прототипирование используется для обмена методами со всеми экземплярами. Похоже, вы пытаетесь использовать прототип, чтобы дать конкретным членам экземпляра производный объект someObj.
Но чтобы понять, почему это плохое решение, вот как работает прототипирование:
Когда JS пытается разрешить (сохранить) ссылку на элемент на объекте, если он не находит этот элемент в объекте, он просматривает свой прототип (и так далее по цепочке прототипов) .
Поэтому, когда вы хотите прочитать someObj.prop1, JS не найдет prop1 в someObj, он ищет в своем прототипе protoObj и найдет protoObj.prop1:
Таким образом, совершенно нормально, что:
someObj.prop1.third.c['joy'] = 'found'
... изменяет прототип, потому что someObj.prop1 разрешается как protoObj.prop1
Незначительная деталь, которую вы игнорируете, состоит в том, что в JS не требуется разрешение члена. Когда ты пишешь что-то вроде:
someObj.stuff.other = 3
JS разрешает someObj.stuff, потому что вы спрашиваете .other .
Но когда вы набираете:
someObj.stuff = 3
JS не разрешает что-либо !! Это только влияет на 3 на вещи члена someObj и вообще не заботится о существовании или несуществовании вещи в someObj или в его прототипе.
Если материал был эффективно в прототипе, новый одноименный член маскирует прототип.
С этого момента вы можете понять, что использование прототипирования JS для предоставления значений элементов экземплярам вообще не является хорошим решением. Вместо этого вам следует рассмотреть возможность установки этих членов в самом конструкторе функций. Например:
function MyObj() {
this.prop1 = {first: 1, second: 2, third: {a: ...} }
this.prop2 = true;
}
Очевидно, что у каждого экземпляра есть свои собственные члены, отличные от членов protoObj.
Если вы хотите использовать прототипирование для предоставления некоторых значений по умолчанию и изменяемых значений вашим объектам и иметь возможность «разветвлять» часть этих значений, когда вы изменяете их через экземпляр (своего рода копирование при записи), это просто невозможно в JavaScript.