Примитивные типы данных в JavaScript передаются по значению, а не по ссылке. Таким образом, когда вы копируете значение, оно фактически копирует его, а не ссылается на него.
Традиционно это происходит потому, что примитив буквально кодируется в памяти таким образом (поэтому примитив int 7 будет кодироваться в памяти как 0x7. Однако при работе с объектами они кодируются как указатель на область памяти, где на самом деле Таким образом, когда вы копируете значение, это просто копия ссылочного указателя, а не объект, на который ссылается этот указатель.
Что касается того факта, что прототип дочернего элемента не заменяется, то это потому, что прототип в Java является просто другим объектом. Таким образом, прототип может выглядеть так:
{
someField: 5
}
Что указывает на то, что экземпляры объекта будут инициализироваться полем с именем someField
, значение которого равно 5
. с помощью приведенного выше кода каждая запись в объекте копируется в дочерний прототип, но ничего не удаляется. Таким образом, если дочерний прототип выглядит так:
{
someField: 10
someOtherField: 3
}
Тогда выполнение вышеуказанной команды extend2 перезапишет someField, но не someOtherField, поэтому полученный прототип будет:
{
someField: 5
someOtherField: 3
}