Чем объясняется такой механизм перезаписи полей объекта?
Подскажите, пожалуйста, что я упускаю, стремясь понять следующее поведение перезаписи полей объекта в javascript в таком вот коде?
const nodeList = {
head: null,
tail: null,
append: function(value) {
const node = {value, next: null};
if (!this.head) {
this.head = node;
this.tail = node;
} else {
this.tail.next = node;
this.tail = node;
}
}
}
nodeList.append('a')
nodeList.append('b')
Конкретно непонятно, как после строк
this.tail.next = node;
this.tail = node;
новый объект node попадает в head, ведь мы не обращаемся к нему. То есть в результате мы получаем вот такой объект:
{
head: {value: 'a', next: {value: 'b', next: null}},
tail: {value: 'b', next: null}
}
Если же сымитировать это поведение так
const nodeList = {
head: null,
tail: null
}
nodeList.head = {value: 'a', next: null}
nodeList.tail = {value: 'a', next: null}
nodeList.tail.next = {value: 'b', next: null}
nodeList.tail = {value: 'b', next: null}
То мы получаем такой объект, что в принципе, ожидаемо
{
head: {value: 'a', next: null}
tail: {value: 'b', next: null}
}
Почему такая разница, механизм же вроде бы одинаковый. Что я не понимаю?