Многоуровневое наследование (multi-level inheritance)

Давайте посмотрим на такой пример. Создадим пустой массив, например myArray

let myArray = [];

Давайте исследовать его.
У него есть свойство __proto__ (прототип) или родитель. В нем мы видим много методов. Они все имплементированы в объекте, который является прототипом или родителем всех массивов в javascript.

Давайте посмотрим что у нас в памяти. У нас есть myArray который является производной от (давайте назовём этот объект array base) базового массива.

Теперь давайте посмотрим на прототип базового массива. И как мы видими, родителем базового массива является базовый объект или корневой объект в js.

array base

Вот что происходит в памяти. myArray производная от базового массива (base array). А базовый массив производный от базового объекта (base object). Это так называемое многоуровневое наследование.

multi level inheritance

Что по поводу объектов, которые мы создаем используя наши кастомные конструкторы?

Допустим возьмём функцию Circle.

function Circle(radius) {
    this.radius = radius;

    this.draw = function () {
        console.log('draw');
    };
}

const circle = new Circle(10);

Если мы откроем объект circle в devtools и посмотрим на его прототип. Его прототип это прототип для всех объектов circle, которые мы создадим с помощью нашего конструктора Circle. Назовем это Circle base.

Каждый раз, когда мы будем вызывать конструктор Circle чтобы создать новый circle объект этот конструктор будет создавать новый объект и устанавливать в качестве прототипа Circle base.

Другими словами

Объекты, созданные с помощью одного конструктора будут иметь один и тот же прототип

Т.е. все circle объекты созданные с помощью Circle конструктора буду иметь один и тот же прототип.

Аналогично, все массивы, созданный конструктором массивов будут иметь общий прототип.

Так вот Circle base тоже имеет прототип, и он ссылается на базовый объект (Object base)

mli