Чем объясняется такой механизм перезаписи полей объекта?

Подскажите, пожалуйста, что я упускаю, стремясь понять следующее поведение перезаписи полей объекта в 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}
}

Почему такая разница, механизм же вроде бы одинаковый. Что я не понимаю?


Ответы (0 шт):