__proto__
is a getter/setter on Object.prototype
which can get the object's internal prototype (if gotten), or set it (if set).
For Object.__proto__
, Object
is a constructor function, and all functions have an internal prototype of Function.prototype
, so that's what you're seeing:
console.log(Object.__proto__ === Function.prototype);
The prototype chain is:
null <- Object.prototype <- Function.prototype <- Object
In contrast, with:
Function.__proto__.__proto__.__proto__
The prototype chain is:
null <- Object.prototype <- Function.prototype <- Function
So, access __proto__
3 times from Function
, and you get to null
.
If type of Object is Function, Isn't everything in JavaScript a function?
Object
is a function only because it's possible to call it as a constructor (which is a very weird thing to do in most cases, but it's technically permitted by the language).
const doNotDoThis = new Object();
Object
is a constructor - this is very different from Object.prototype
, which is a plain object. Most non-primitives inherit from Object.prototype
, but only functions inherit from Function.prototype
.