Способ, которым был разработан Javascript, null
находится наверху цепочки прототипов каждого объекта. Как указано в спецификации , для внутреннего метода GetPrototypeOf
его сигнатура типа ( ) → Object | Null
, и она:
Определите объект, который предоставляет унаследованные свойства для этого объекта. Нулевое значение указывает на отсутствие унаследованных свойств.
Доступ к свойству __proto__
объекта или использование Object.getPrototypeOf
вызовет этот внутренний метод. Свойство __proto__
существует на большинстве объектов (поэтому оно не возвращает undefined
), но объект, к которому он вызывается, не обязательно имеет внутренний прототип (и если его нет, эта операция возвращает null
).
Посмотрите, как __proto__
является получателем / установщиком на Object.prototype
:
console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));
Это свойство будет существовать для любого объекта, который проходит через Object.prototype
, что большинство делает. Получатель может вернуть null
.
Обратите внимание, что если вы создаете объект, который не наследует от Object.prototype
, свойство __proto__
не будет находиться в цепочке прототипов, и вы получите undefined
:
const obj = Object.create(null);
console.log(obj.__proto__);