Если свойство Object не найдено (Obj Constructor), возвращаемое значение Не является неопределенным. Почему? - PullRequest
1 голос
/ 17 марта 2020

Рассмотрим базовый c пример, в котором я пытаюсь запросить свойство, которого нет в объекте

CASE-I: (Общий объект)

var obj1 = {
  name: "Jack",
  age: 29
} 

console.log(obj1.city); 

Ответ: undefined

Это означает, что если есть свойство, которого нет, оно по праву называется undefined.

CASE-II: (Конструктор объектов)

Теперь я собираюсь сделать то же самое - сначала создать строку, которая наследуется от String Constructor, которая наследуется от Object Constructor. __proto__ Object-Constructor не имеет свойства с именем __proto__, поэтому ответ должен быть неопределенным. Но скорее (странно) это возвращает null. Что за гранью понимания.

As far as I know, if the property of an Object is not found - its value should be `**undefined**` and not `**null**`. 

enter image description here

Теперь, кто-то, пожалуйста, помогите в понимании - что после подъема prototype chain концепции и реализации должны остаться прежними. Итак, если __proto__ свойство Object Constructor не найдено, почему ответ должен быть не undefined, а null ???

1 Ответ

2 голосов
/ 17 марта 2020

Способ, которым был разработан 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__);
...