function Student(name, age) { this.name = name; this.age = age; } Student.prototype.showDetails = function () { console.log(`${this.name}, ${this.age}`); }; let Manish = new Student('Manish', 34); console.log(Manish.__proto__.__proto__.__proto__); console.log(Manish);En el código anterior, la penúltima línea
console.log(Manish.__proto__.__proto__.__proto__); ... registra null como se esperaba. Sin embargo, cuando navego manualmente a través de la cadena de prototipos usando el objeto de la última línea console.log(Manish) , tengo que bajar 5-6 niveles de la propiedad __proto__ hasta obtener un valor null .
¿Hay alguna explicación para esta diferencia? 

La entrada __proto__ que ve en el tercer nivel de la consola es la función getter que ejecuta cuando hace Manish.__proto__ . Tenga en cuenta que Manish no tiene una propiedad propia con el nombre __proto__ , es siguiendo la cadena de prototipos que accede al getter __proto__ que ve en la salida de la consola.
Tenga en cuenta también que la salida de la consola ejecuta ese getter para mostrarle el objeto que es el mismo objeto que muestra en la entrada [[Prototype]] en el nivel superior.
La clave aquí es que cuando accede a __proto__ como lo hace, ejecuta una función (captador) que se define más arriba en la cadena de prototipos.
Las entradas [[Prototype]] no son propiedades de JavaScript, sino ranuras internas que están definidas en la especificación ECMA Script, pero no son accesibles como propiedades en el código JavaScript. Las interfaces de la consola brindan acceso a estas ranuras para brindar transparencia adicional, pero también pueden generar confusión.