Давайте ещё немного попрактикуемся в наших замечательных навыках чтения спецификации. Если вы ещё не посмотрели предыдущий эпизод, сейчас самое время это сделать!
Все эпизоды
Готовы ко второй части?
Весёлый способ узнать спецификацию — начать с функции JavaScript, о которой мы знаем, и узнать, как она описана.
Внимание! Этот эпизод содержит скопированные алгоритмы из спецификации ECMAScript состоянием на февраль 2020 года. Они со временем устареют.
Мы знаем, что свойства ищутся в цепочке прототипов: если объект не имеет свойства, которое мы пытаемся считать, мы поднимаемся по цепочке прототипов, пока не найдем его (или пока не найдем объект, у которого больше нет прототипа).
Например:
const o1 = { foo: 99 };
const o2 = {};
Object.setPrototypeOf(o2, o1);
o2.foo;
Где определена проходка по прототипу?
Попробуем найти, где определено такое поведение. Хорошее место для начала — это список внутренних методов объекта.
Есть как [[GetOwnProperty]]
, так и [[Get]]
— нас интересует версия, которая не ограничена только собственными свойствами, поэтому мы выбираем [[Get]]
.
К сожалению, тип спецификации описателя свойства также имеет поле [[Get]]
, поэтому при просмотре спецификации для [[Get]]
нам нужно тщательно различать два независимых использования.