Как понять когда цепочка прототипов завершается?

В первом случае цепочка прототипов длиннее, чем во втором.

function Func() {};
Func.__proto__ == Function.prototype; //true
Func.__proto__.__proto__ == Object.prototype; //true
Func.__proto__.__proto__.__proto__ == Object.prototype; //false
Func.__proto__.__proto__.__proto__.__proto__ == Object.prototype; //Cannot read property '__proto__' of null

Во втором случае она короче.

let obj = {};
    obj.__proto__ == Object.prototype; //true
    obj.__proto__.__proto__ == Object.prototype; //false
    obj.__proto__.__proto__.__proto__ == Object.prototype; //Cannot read property '__proto__' of null

Почему? В предпоследней строчке второго примера obj.__proto__.__proto__ == Object.prototype непонятно почему выдает false. Хотя у Object.prototype тоже вроде бы как должно быть св-во __proto__. В первом же случае в строке Func.__proto__.__proto__ == Object.prototype св-во __proto__ есть. Почему же здесь его нет? В чем разница?


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

Автор решения: vsemozhebuty
  1. В первом случае у вас цепочка прототипов на одно звено больше, потому что в начале там подкласс объекта, а не чистый объект.
  2. __proto__ не всегда ссылается на Object.prototype, поэтому в этом нет противоречия:

В предпоследней строчке второго примера obj.__proto__.__proto__ == Object.prototype непонятно почему выдает false. Хотя у Object.prototype тоже вроде бы как должно быть св-во __proto__.

Object.prototype.__proto__ ссылается не на Object.prototype, а на null, иначе получилась бы циклическая, бесконечная цепочка прототипов.

→ Ссылка